Pagini recente » Cod sursa (job #507158) | Cod sursa (job #3255607) | Cod sursa (job #3252147) | Cod sursa (job #3255507) | Cod sursa (job #195087)
Cod sursa(job #195087)
#include<stdio.h>
long a[100001],x,n,m,i,c;
long cb0(long st,long dr);
long cb1(long st,long dr);
long cb2(long st,long dr);
int main()
{
freopen("cautbin.in","r",stdin);
freopen("cautbin.out","w",stdout);
scanf("%ld",&n);
for(i=1;i<=n;i++)scanf("%ld",&a[i]);
scanf("%ld",&m);
for(;m;m--)
{ scanf("%ld%ld",&c,&x);
if(c==1){printf("%ld",cb1(1,n));continue;}
if(c==2){printf("%ld",cb2(1,n));continue;}
printf("%ld",cb0(1,n));
}
return 0;
}
long cb0(long st,long dr)
{
long mid;
if(a[st]>x)return -1;
if(a[dr]<x)return -1;
if(dr-st>1)
{ mid=(st+dr)>>1;
if(a[mid]>x)return cb0(st,mid-1);
return cb0(mid,dr);
}
if(a[dr]==x)return dr;
if(a[st]==x)return st;
return -1;
}
long cb1(long st,long dr)
{ long mid;
if(a[dr]<=x)return dr;
mid=(st+dr)>>1;
if(a[mid]<=x)return cb1(mid,dr-1);
return cb1(st,mid-1);
}
long cb2(long st,long dr)
{ long mid;
if(a[st]>=x)return st;
mid=(st+dr)>>1;
if(a[mid]>=x)return cb2(st+1,mid);
return cb2(mid+1,dr);
}