Se dau două numere naturale și și un șir de numere naturale diferite . Să se construiască un șir de numere naturale care să respecte simultan următoarele condiții:
- Toate numerele din șirul construit trebuie să aparțină intervalului .
- Elemente șirului construit trebuie să se afle în ordine crescătoare, adică , unde s-a notat cu șirul construit.
- Considerăm următorul algoritm de căutare binară:
int binary_search(const vector<int>& a, int target) {
int left = 0, right = (int)a.size() - 1;
int counter = 0;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] == target) {
return counter;
}
counter += 1;
if (a[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return counter;
}
Dacă acest algoritm este aplicat pe șirul construit, iar pe rând se caută fiecare număr din șirul , suma valorilor returnate de funcția binary_search trebuie să fie minimă.
Date de intrare
Prima linie a fișierului de intrare conține două numere naturale și , reprezentând numărul de elemente din șirul , respectiv numărul de elemente al șirului care trebuie construit.
A doua linie conține numere naturale diferite , reprezentând elementele șirului .
Date de ieșire
Programul trebuie să afișeze pe o singură linie șirul de numere naturale, separate prin câte un spațiu, care reprezintă soluția problemei, respectând condițiile enunțate.
Restricții și precizări
- , pentru
- Cele numere naturale din șirul sunt diferite, dar cele din șirul rezultat nu trebuie să fie neapărat diferite.
# | Puncte | Restricții |
---|---|---|
1 | 15 | și |
2 | 30 | (împreună cu celelalte constrângeri generale) |
3 | 40 | Șirul este sortat strict crescător, adică |
4 | 15 | și |
Exemplu
cb.in
3 7
6 3 10
cb.out
1 3 3 6 6 10 10
Explicație
Funcția binary_search va returna valorile şi pentru numerele şi din șirul , conducând la o sumă minimă a valorilor returnate.