Pagini recente » Cod sursa (job #2384454) | Cod sursa (job #686034) | Cod sursa (job #782171) | Cod sursa (job #562306) | Cod sursa (job #1428809)
#include <fstream>
using namespace std;
ifstream fin ("cautbin.in");
ofstream fout ("cautbin.out");
int N, M, tip, x, log_N, lg, i, V[100010];
/// Cautarea binara pe biti are la baza ideea de a determina pozitia unui element cautat ca suma de puteri ale lui 2;
int main()
{
fin >> N; /// Citesc numarul de elemente;
for (int i = 1; i <= N; i++) {
fin >> V[i]; /// Citesc elementele vectorului;
}
for (log_N = 1; log_N <= N; log_N <<= 1); /// Calculez cea mai mica putere a lui 2 care depaseste pe N;
log_N >>= 1; /// Calculez cea mai mare putere a lui 2 care nu depaseste pe N;
fin >> M; /// Citesc numarul de intrebari;
while (M--) /// Cat timp M diferit de 0;
{
fin >> tip >> x; /// Citesc tipul cautarii si elementul cautat;
if (tip < 2)
{
for (i = 0, lg = log_N; lg; lg >>= 1) { /// Determina cea mai din dreapta pozitie a unui element mai mic sau egal decat cel cautat;
if (i + lg <= N && V[i + lg] <= x) {
i += lg;
}
}
if (V[i] != x && tip == 0) { /// Daca tipul cautarii este 0 si nu am gasit elementul afisam -1;
fout << "-1\n";
}
else fout << i << '\n'; /// Ori tipul este 0 si am gasit elementul sau tipul este 1, caz in care am gasit pozitia ceruta;
}
else
{
for (i = N, lg = log_N; lg; lg >>= 1) { /// Determina cea mai din stanga pozitie a unui element mai mare sau egal decat cel cautat;
if (i - lg > 0 && V[i - lg] >= x) {
i -= lg;
}
}
fout << i << '\n'; /// Afisam pozitia gasita;
}
}
fout.close();
return 0;
}
/// С днём победы !!!
/// Si acum stirea zilei "Andra любит young Rosu Marius"