Pagini recente » Cod sursa (job #2085613) | Cod sursa (job #1794457) | Cod sursa (job #1608544) | Cod sursa (job #1742596) | Cod sursa (job #2418458)
/*
0 x - cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
1 x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
*/
#include <fstream>
#include <iostream>
#define nmax 100005
using namespace std;
//ifstream fin("date.in");
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n, v[nmax], q, c, x;
int caut_binar(int st, int dr, int x){
long long mij, sol = -1;
while(st <= dr){
mij = (st + dr) / 2;
if(x == v[mij]){
sol = mij;
st = mij + 1;
}
else if(x < v[mij])
dr = mij - 1;
else st = mij + 1;
}
return sol;
}
int low(int st, int dr, int x){
long long mij, sol = -1;
while(st <= dr){
mij = (st + dr) / 2;
if(x >= v[mij]){
sol = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return sol;
}
int high(int st, int dr, int x){
long long mij, sol = -1;
while(st <= dr){
mij = (st + dr) / 2;
if(x <= v[mij]){
sol = mij;
dr = mij - 1;
}
else st = mij + 1;
}
return sol;
}
int main(){
fin >> n;
for(int i = 1; i <= n; ++i)
fin >> v[i];
fin >> q;
for(int i = 1; i <= q; ++i){
fin >> c >> x;
if(c == 0)
fout << caut_binar(1, n, x) << '\n';
else if(c == 1)
fout << low(1, n, x) << '\n';
else
fout << high(1, n, x) << '\n';
}
fin.close();
fout.close();
return 0;
}