Pagini recente » Cod sursa (job #1002377) | Cod sursa (job #833014) | Cod sursa (job #733942) | Cod sursa (job #1143619) | Cod sursa (job #1612893)
#include <iostream>
#include <fstream>
#include <functional>
#include <cmath>
#include <vector>
using namespace std;
template <typename Rit, typename Cmp, typename T>
Rit cautbin(Rit st, Rit dr, Cmp c, T t){
// e esentialemente uppper bound - 1 -> ultima pozitie care da false cu functia
// f(x) = c(t, a)
// presupunem ca c(t, a[0]) e false
const int n = dr-st+1;
for(int i = 0, step = 1 << (int)log2(n); step > 0; step /= 2){
if(st+step < dr && !c(t, st[step])){
st += step;
}
}
return st;
}
int main()
{
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int n;
f >> n;
vector<int> v(n);
for(int i = 0; i < n; ++i){
f >> v[i];
}
int m;
f >> m;
for(int i = 0, t, x; i < m; ++i){
f >> t;
if(t == 0){
f >> x;
const int rez = cautbin(v.begin(), v.end(), less<int>(), x) - v.begin();
g << (v[rez] == x ? rez+1 : -1) << '\n';
}
else if(t == 1){
f >> x;
g << (cautbin(v.begin(), v.end(), less<int>(), x) - v.begin() + 1) << '\n';
}
else if(t == 2){
f >> x;
g << n - (cautbin(v.rbegin(), v.rend(), greater<int>(), x) - v.rbegin()) << '\n';
}
}
return 0;
}