Pagini recente » Cod sursa (job #665137) | Cod sursa (job #2055677) | Cod sursa (job #2112807) | Cod sursa (job #1370106) | Cod sursa (job #499771)
Cod sursa(job #499771)
#include<fstream.h>
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int n,m,v[100001],i,tip,st,dr,p,gasit,mij,x;
void caut0()
{
while(st<=dr&&!gasit)
{mij=st+(dr-st)/2;
if(v[mij]==x) gasit=1,p=mij;
else if(v[mij]<x) st=mij+1;
else dr=mij-1;}
if(gasit) while(v[p+1]==x&&p<n) p++;
else p=-1;
}
void caut1()
{
while(st<=dr&&!gasit)
{mij=st+(dr-st)/2;
if(v[mij]==x) gasit=1,p=mij;
else if(v[mij]<x) st=mij+1;
else dr=mij-1;}
if(gasit) while(v[p+1]==x&&p<n) p++;
else {p=dr;
if(v[p+1]<=x&&p<n)p++;
else while(v[p]>x&&p>1)p--;}
}
void caut2()
{
while(st<=dr&&!gasit)
{mij=st+(dr-st)/2;
if(v[mij]==x) gasit=1,p=mij;
else if(v[mij]<x) st=mij+1;
else dr=mij-1;}
if(gasit) while(v[p-1]==x&&p>1) p--;
else {p=st;
if(v[p-1]>=x&&p>1) p--;
else while(v[p]<x&&p<n) p++;}
}
int main()
{
f>>n;
for(i=1;i<=n;i++) f>>v[i];
f>>m;
while(m--)
{f>>tip>>x;
st=1;dr=n;gasit=0;
if(tip==0) caut0();
else if(tip==1) caut1();
else caut2();
g<<p<<'\n';}
f.close(); g.close();
return 0;
}