Cod sursa(job #786599)

Utilizator sinio1Stirbat Luca sinio1 Data 11 septembrie 2012 17:11:39
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>

using namespace std;

const int K = 16;
const int W = 100000;
unsigned int v[W];
int cautb0 (unsigned int x,unsigned int n)
{
    int i=0,pas=1<<K;
    while (pas!=0)
    {
        if (i+pas<n&&v[i+pas]<=x)
            i+=pas;
        pas/=2;
    }
    if(v[i] == x)
        return i;
    else
        return -2;
}
int cautb1 (unsigned int x,unsigned int n)
{
    int i=0,pas=1<<K;
    while (pas!=0)
    {
        if (i+pas<n&&v[i+pas]<=x)
            i+=pas;
        pas/=2;
    }
    return i;
}
int cautb2 (unsigned int x, unsigned int n)
{
    int i=0,pas=1<<K;
    while (pas!=0)
    {
        if (i+pas<n&&v[i+pas]<x)
            i+=pas;
        pas/=2;
    }
    return 1+i;
}

int main()
{
    //FILE * fin, *fout;
    //fin=fopen("cautbin.in","r");
    //fout=fopen("cautbin.out","w");

    ifstream in("cautbin.in");
    ofstream out("cautbin.out");

    unsigned int n,i,nri,intrebare,x;
    int d;
    //fscanf(fin,"%u",&n);
    in >> n;
    for (i=0; i<n; i++)
    {
         //fscanf(fin,"%u",&v[i]);
         in >> v[i];
    }
    //fscanf(fin,"%u",&nri);
    in >> nri;
    for (i=1; i<=nri; i++)
    {
        //fscanf(fin,"%u",&intrebare);
        //fscanf(fin,"%u",&x);
        in >> intrebare >> x;
        if (intrebare==0)
            d=cautb0(x,n);
        if (intrebare==1)
            d=cautb1(x,n);
        if (intrebare==2)
            d=cautb2(x,n);
        //fprintf (fout,"%d\n",d + 1);
        out << (d+1) << "\n";
    }

    //fclose(fin);
    //fclose(fout);
    return 0;
}