Pagini recente » Cod sursa (job #2602015) | Cod sursa (job #913722) | Cod sursa (job #3038210) | Cod sursa (job #2366709) | Cod sursa (job #1425125)
#include <iostream>
#include <fstream>
#define NMAX 100000
const char IN[] = "cautbin.in", OUT[] = "cautbin.out";
using namespace std;
int N;
int v[NMAX];
inline int findPos(int x) {
int low = 0;
int high = N - 1;
int m=0;
while (low < high) {
m = low + (high - low) / 2;
if (v[m] == x) break;
if (v[m] > x) high = m - 1;
else low = m + 1;
}
if (v[m] == x) {
while (v[m] == x) ++m;
return m;
}
return -1;
}
inline int findMaxPos(int x) {
int low = 0;
int high = N - 1;
int m = 0;
while (low < high) {
m = low + (high - low) / 2;
if (v[m] <= x && v[m+1] > x) return m+1;
if (v[m] > x) high = m - 1;
else low = m + 1;
}
return -1;
}
inline int findMinPos(int x) {
int low = 0;
int high = N - 1;
int m = 0;
while (low <= high) {
m = low + (high - low) / 2;
if (v[m] >= x && v[m - 1] < x) return m+1;
if (v[m] >= x) high = m - 1;
else low = m + 1;
}
return -1;
}
inline void readData() {
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
scanf(" %d", &N);
for (int i = 0; i < N; ++i) scanf(" %d", &v[i]);
int M;
scanf(" %d", &M);
for (int i = 0; i < M; ++i) {
int mod, x;
scanf(" %d%d", &mod, &x);
switch (mod) {
case 0: printf("%d \n", findPos(x)); break;
case 1: printf("%d \n", findMaxPos(x)); break;
case 2: printf("%d \n", findMinPos(x)); break;
}
}
fclose(stdin);
fclose(stdout);
}
int main() {
readData();
return 0;
}