Pagini recente » Cod sursa (job #2601379) | Cod sursa (job #1511801) | Cod sursa (job #682683) | Cod sursa (job #2347184) | Cod sursa (job #2185760)
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen("cautbin.in","r"),*g=fopen("cautbin.out","w");
int n,m;
int v[100000];
void solve1(int left,int right,int a)
{
int middle;
while(left<right)
{
middle=left+(right-left)/2;
if(v[middle]==a)
break;
if(a<v[middle])
right=middle-1;
if(a>v[middle])
left=middle+1;
}
middle=left+(right-left)/2;
if(v[middle]>a)
middle--;
else
{
while(v[middle+1]==v[middle])
middle++;
}
fprintf(g,"%i\n",middle+1);
}
void solve2(int left,int right,int a)
{
int middle;
while(left<right)
{
middle=left+(right-left)/2;
if(v[middle]==a)
break;
if(a<v[middle])
right=middle-1;
if(a>v[middle])
left=middle+1;
}
middle=left+(right-left)/2;
if(v[middle]<a)
middle++;
else
{
while(v[middle]==v[middle-1])
middle--;
}
fprintf(g,"%i\n",middle+1);
}
void citire_si_rezolvare()
{
fscanf(f,"%i",&n);
for(int i=0;i<n;i++)
fscanf(f,"%i",&v[i]);
fscanf(f,"%i",&m);
for(int i=0,a,b;i<m;i++)
{
fscanf(f,"%i %i",&a,&b);
if(a==0)
{
int *up=upper_bound(v,v+n,b);
if((up!=v+n)||(v[up-v-1]==b))
fprintf(g,"%i\n",up-v);
else
fprintf(g,"-1\n");
}
if(a==1)
solve1(0,n-1,b);
if(a==2)
solve2(0,n-1,b);
}
}
int main()
{
citire_si_rezolvare();
return 0;
}