Nu aveti permisiuni pentru a descarca fisierul grader_test38.ok
Cod sursa(job #1142914)
Utilizator | Data | 14 martie 2014 13:36:44 | |
---|---|---|---|
Problema | Cautare binara | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.33 kb |
#include <cstdio>
#include <fstream>
using namespace std;
int n,m;
int a[100005];
int b_search0(int x)
{
int i,step=1;
while (step<n) step<<=1;
for(i=1;step;step>>=1)
{
if (i+step<=n && a[i+step]<=x) i+=step;
}
if (a[i]!=x) return -1;
return i;
}
int b_search1(int x)
{
int i,step=1,maxim=1;
while(step<n) step<<=1;
for (i=1;step;step>>=1)
if (i+step<=n && a[i+step]==x) i+=step;
else if (i+step<=n && a[i+step]<x) {i+=step; maxim=i;}
if (a[i]==x) return i;
return maxim;
}
int b_search2(int x)
{
int i,step=1,minim=n+1;
while(step<n) step<<=1;
for(i=1;step;step>>=1)
if(i+step<=n && a[i+step]==x) minim=i+step;
else if (i+step<=n && a[i+step]<x) i+=step;
if (i==1 && minim==n+1) return 1;
if (a[i]!=x) return i+1;
return minim;
}
int main()
{
freopen("cautbin.in","r",stdin);
freopen("cautbin.out","w",stdout);
int cod,x;
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=0;i<m;++i)
{
scanf("%d %d",&cod,&x);
if (cod==0) printf("%d\n",b_search0(x));
else if (cod==1) printf("%d\n",b_search1(x));
else if (cod==2) printf("%d\n",b_search2(x));
}
return 0;
}