Mai intai trebuie sa te autentifici.
Cod sursa(job #200940)
Utilizator | Data | 27 iulie 2008 17:10:47 | |
---|---|---|---|
Problema | Cautare binara | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.85 kb |
#include <cstdio>
int N,V[100001],M,pow2;
void proc_log()
{
int log2N=0;
for(int i=2;i<=N;++i)
if(!(i&(i-1))) ++log2N;
pow2 = 1<<log2N;
}
int bsc(int e,int op)
{
int i,poww2=pow2;
for(i=1;i<=N && poww2;)
if(V[i+poww2]>e || i+poww2>N) poww2>>=1;
else i+=poww2;
switch (op)
{
case 0: if (V[i]==e) return i;
else return -1;
case 1: return i;
case 2: if(V[i]==e) return i;
else return i+1;
}
}
int main()
{
freopen("cautbin.in","r",stdin);
freopen("cautbin.out","w",stdout);
scanf("%d",&N);
proc_log();
for(int i=1;i<=N;scanf("%d",&V[i++]));
scanf("%d",&M);
while(M--)
{
int q,p;
scanf("%d %d",&q,&p);
switch (q)
{
case 0: printf("%d\n",bsc(p,0)); break;
case 1: printf("%d\n",bsc(p,1)); break;
case 2: printf("%d\n",bsc(p,2)); break;
}
}
return 0;
}