Pagini recente » Cod sursa (job #1262839) | Cod sursa (job #442103) | Cod sursa (job #1597187) | Cod sursa (job #2242757) | Cod sursa (job #2542641)
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 100505;
int N, M, arr[NMAX];
int largestLte(int x) {
if (arr[1] > x) {
return 0;
}
// arr[left] <= x < arr[right]
int left = 1, right = N + 1, mid;
while (right - left > 1) {
mid = left + (right - left) / 2;
if (arr[mid] > x) {
right = mid;
} else {
left = mid;
}
}
return left;
}
int main() {
freopen("cautbin.in", "r", stdin);
freopen("cautbin.out", "w", stdout);
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &M);
int queryType, x;
for (int queryNo = 0; queryNo < M; queryNo++) {
scanf("%d%d", &queryType, &x);
switch(queryType) {
case 0: {
int posLte = largestLte(x);
if (posLte >= 1 && arr[posLte] == x){
printf("%d\n", posLte);
} else {
printf("-1\n");
}
break;
}
case 1: {
printf("%d\n", largestLte(x));
break;
}
case 2: {
int posLte = largestLte(x - 1);
if (posLte == 0 || arr[posLte] < x) {
posLte++;
}
printf("%d\n", posLte);
break;
}
}
}
return 0;
}