Pagini recente » Cod sursa (job #1944284) | Cod sursa (job #1089526) | Cod sursa (job #3124182) | Cod sursa (job #949860) | Cod sursa (job #833717)
Cod sursa(job #833717)
#include <fstream>
using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
int n, v[100000];
// l excl; r incl
int last_le(int x) {
int l = -1, r = n-1;
do {
int m = l + (r - l + 1) / 2;
if (v[m] <= x)
l = m;
else
r = m - 1;
} while (l < r);
return l; /* == r_i */
}
// l incl; r excl
int first_ge(int x) {
int l = 0, r = n;
do {
int m = l + (r - l) / 2;
if (v[m] < x)
l = m + 1;
else
r = m;
} while (l < r);
return l; /* == r */
}
int main() {
int i, tmp, op, x, m;
in>>n;
for (i = 0; i < n; ++i)
in>>v[i];
in>>m;
for (i = 0; i < m; ++i) {
in>>op>>x;
switch (op) {
case 0: tmp = last_le(x);
out<<(tmp >= 0 ? (v[tmp] == x ? tmp : -2) : -2) + 1<<endl; break;
case 1: out<<last_le(x) + 1<<endl; break;
case 2: out<<first_ge(x) + 1<<endl; break;
}
}
return 0;
}