Pagini recente » Borderou de evaluare (job #1040029) | Cod sursa (job #1161357)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int low = -1, up = 0;
int a[100010];
int n, m;
int cautbin(int val, int tip)
{
int step = 1, i;
while(step < n)
step <<= 1;
for(i = 0; step; step >>= 1)
if(i+step < n && a[i+step] - val <= tip)
i+=step;
return i;
}
void citire()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
}
void solve()
{
scanf("%d", &m);
int p, x, t;
while(m--)
{
scanf("%d%d", &t, &x);
switch(t)
{
case 0:
p = cautbin(x, up);
if(a[p] == x)
printf("%d\n", p+1);
else
printf("-1\n");
break;
case 1:
p = cautbin(x, low);
if(a[p+1] == x)
p++;
printf("%d\n", p+1);
break;
case 2:
p = cautbin(x, up);
if(a[p]!=x)
p++;
printf("%d\n", p+1);
}
}
}
int main()
{
freopen("cautbin.in", "r", stdin);
freopen("cautbin.out", "w", stdout);
citire();
solve();
return 0;
}