Pagini recente » Cod sursa (job #2320151) | Monitorul de evaluare | Cod sursa (job #827626) | Cod sursa (job #2763283) | Cod sursa (job #3319704)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
struct intrb
{
int nr;
int val;
};
int cautbin(const vector<int> &v, int x)
{
int a = 0;
int b = v.size() - 1;
while(a <= b)
{
int mij = a + (b - a) / 2;
if(x < v[mij])
{
b = mij - 1;
}
else if(x > v[mij])
{
a = mij + 1;
}
else
{
return mij;
}
}
return -1;
}
intrb s[100001];
int main()
{
vector<int> v;
int n;
fin >> n;
for(int i = 0; i < n; i++)
{
int a;
fin >> a;
v.push_back(a);
}
int m;
fin >> m;
for(int i = 1; i <= m; i++)
{
fin >> s[i].nr >> s[i].val;
if(s[i].nr == 0)
{
int a = cautbin(v, s[i].val);
if(a != -1)
{
while(a + 1 < n && v[a + 1] == s[i].val)
a++;
}
fout << a+1 << '\n';
}
else if(s[i].nr == 1)
{
// cea mai mare pozitie cu valoare <= val
int l = 0, r = n - 1, ans = -1;
while(l <= r)
{
int mid = l + (r - l) / 2;
if(v[mid] <= s[i].val)
{
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
fout << ans+1 << '\n';
}
else
{
// nr == 2, cea mai mica pozitie cu valoare >= val
int l = 0, r = n - 1, ans = -1;
while(l <= r)
{
int mid = l + (r - l) / 2;
if(v[mid] >= s[i].val)
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
fout << ans+1<< '\n';
}
}
}