Pagini recente » Cod sursa (job #1213606) | Cod sursa (job #1398430) | Cod sursa (job #2533462) | Cod sursa (job #1018041) | Cod sursa (job #2884021)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
#define limn 100001
int v[limn];
int n, m;
/// cea mai mare pozitie pe care se afla un element cu valoarea val
/// sau -1 daca aceasta valoare nu se gaseste in sir
int query0(int val)
{
int mask, pos;
/// construim masca initiala
for(mask = 1; mask <= n; mask <<= 1);
mask >>= 1;
///construim pozitia
pos = 0;
for(; mask; mask >>=1){
if(pos+mask <= n && v[pos+mask]<=val)
pos += mask;
}
if(v[pos] == val)
return pos;
return -1;
}
/// cea mai mare pozitie pe care se afla un element cu valoarea
/// mai mica sau egala cu x in sir
int query1(int val){
int mask, pos;
/// construim masca initiala
for(mask = 1; mask <= n; mask <<= 1);
mask >>= 1;
///construim pozitia
pos = 0;
for(; mask; mask >>=1){
if(pos+mask <= n && v[pos+mask]<=val)
pos += mask;
}
return pos;
}
/// cea mai mica pozitie pe care se afla un element cu
/// valoarea mai mare sau egala cu VAL in sir
int query2(int val){
int mask, pos;
/// construim masca initiala
for(mask = 1; mask <= n; mask <<= 1);
mask >>= 1;
///construim pozitia
pos = n;
for(; mask; mask >>=1){
if(pos-mask >= 1 && v[pos-mask]>=val)
pos -= mask;
}
return pos;
}
int main()
{
int tipq, val;
fin>>n;
for(int i = 1; i <= n; i++)
fin>>v[i];
fin>>m;
while(m--){
fin>>tipq>>val;
if(tipq == 0)
fout<<query0(val)<<'\n';
else if(tipq == 1)
fout<<query1(val)<<'\n';
else if(tipq == 2)
fout<<query2(val)<<'\n';
}
fin.close();
return 0;
}