Cod sursa(job #1428806)

Utilizator EpictetStamatin Cristian Epictet Data 5 mai 2015 09:25:39
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#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 ideia 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;
}