Cod sursa(job #1089642)

Utilizator kiralalaChitoraga Dumitru kiralala Data 21 ianuarie 2014 20:25:04
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#define NMAX 100005

using namespace std;

FILE* f=freopen("cautbin.in","r",stdin);
FILE* o=freopen("cautbin.out","w",stdout);

int n,m;
int v[NMAX];

int binsearch(int val)
{
    int i,p;
    for(p=1;p<n;p<<=1);
    for(i=0;p;p>>=1)
        if(i+p<n&&v[i+p]<=val)
            i+=p;
    return i;
}

int main()
{
    scanf("%d",&n);

    for(int i=0;i<n;++i)
        scanf("%d",&v[i]);

    scanf("%d",&m);

    for(int i=0;i<m;++i)
    {
        int t,x;
        scanf("%d%d",&t,&x);
        int p=binsearch(x);
        switch(t)
        {
            case 0:
                printf("%d\n",((v[p]==x)?p+1:-1));
                break;
            case 1:
                printf("%d\n",p+1);
                break;
            case 2:
                while(v[p]==x) p-=1;
                printf("%d\n",p+2);
                break;
        }
    }

    return 0;
}