Cod sursa(job #827522)

Utilizator ericptsStavarache Petru Eric ericpts Data 2 decembrie 2012 10:56:32
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
using namespace std;
int v[100005];
int n;
static int logN;
int asc(int x)
{
    int step=logN,ref;
    for(ref=0;step;step>>=1)
        if((ref|step) <= n && v[ref|step] <= x)
            ref|=step;
    return ref;
}
int desc(int x)
{
    int step=logN,ref;
    for(ref=n;step;step>>=1)
        if(ref-step > 0 && v[ref-step] >= x)
            ref-=step;
    return ref;
}
int main()
{
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    int m,i;
    int tip,a;
    scanf("%d",&n);
    for(logN=1;logN<=n;logN<<=1);
    for(i=1;i<=n;++i)
        scanf("%d",v+i);
    scanf("%d",&m);
    int x;
    while(m--)
    {
        scanf("%d %d",&tip,&a);
        if(tip == 0)
        {
            x = asc(a);
            if(v[x] != a)
                printf("-1\n");
            else
                printf("%d\n",x);
        }
        else if(tip == 1)
            printf("%d\n",asc(a));
        else
            printf("%d\n",desc(a));
    }
    return 0;
}