Cod sursa(job #1700317)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 10 mai 2016 00:17:57
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
using namespace std;

const int NMAX = 1e5+5;

int n,v[NMAX];

inline int a(int arg) {
    int m, ans;

    for(m=1; m<n; m<<=1); m>>=1;
    for(ans=0; m; m>>=1)
        if((ans|m)<n && v[ans|m]<=arg)
            ans|=m;

    if(v[ans]!=arg)
        return -1;
    return ans+1;
}

inline int b(int arg) {
    int m, ans;
    for(m=1; m<n; m<<=1); m>>=1;
    for(ans=0; m; m>>=1)
        if((ans|m)<n && v[ans|m]<=arg)
            ans|=m;

    return ans+1;
}

inline int c(int arg) {
    int m, ans;
    for(m=1; m<n; m<<=1); m>>=1;
    for(ans=0; m; m>>=1)
        if((ans|m)<n && v[ans|m]<arg)
            ans|=m;

    return ans+2;
}


int main(void) {
    FILE *fi = fopen("cautbin.in","r");
    FILE *fo = fopen("cautbin.out","w");
    int m, tsk, arg;

    fscanf(fi,"%d",&n);
    for(int i=0; i<n; ++i)
        fscanf(fi,"%d",&v[i]);
    fscanf(fi,"%d",&m);
    while(m--) {
        fscanf(fi,"%d%d",&tsk,&arg);
        switch(tsk) {
        case 0:
            fprintf(fo,"%d\n",a(arg));
            break;
        case 1:
            fprintf(fo,"%d\n",b(arg));
            break;
        case 2:
            fprintf(fo,"%d\n",c(arg));
            break;
        }
    }
    return 0;
}