Pagini recente » Cod sursa (job #1819825) | Cod sursa (job #1266156) | Cod sursa (job #472266) | Cod sursa (job #1655689) | Cod sursa (job #1890486)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
int cautbin(const vector<int> &v, int x)
{
int i = 0, j = v.size();
while (i < j) {
int m = i + (j-i)/2;
if (x < v[m]) {
j = m-1;
} else if (x > v[m]){
i = m+1;
} else {
return m;
}
}
return -1;
}
int upper(const vector<int> &v, int x)
{
int i = 0, j = v.size()-1;
while (i < j) {
int m = i + (j-i)/2;
if (x > v[m]) {
i = m+1;
} else {
j = m;
}
}
return i;
}
int lower(const vector<int> &v, int x)
{
int i = 0, j = v.size();
while (i < j) {
int m = i + (j-i)/2;
if (x < v[m]) {
j = m-1;
} else {
i = m;
}
}
return i;
}
int main()
{
ios_base::sync_with_stdio(false);
ifstream f("cautbin.in");
int n;
f >> n;
vector<int> v(n);
for (int i = 0; i < n; ++i) {
f >> v[i];
}
int m;
f >> m;
ofstream g("cautbin.out");
for (int i = 0; i < m; ++i) {
int op, x;
f >> op >> x;
if (op == 0) {
int pos = cautbin(v, x);
if (pos > 0) {
while (v[pos] == x) ++pos;
}
g << pos << '\n';
} if (op == 1) {
int pos = lower(v, x);
while (pos < v.size()-1 && v[pos+1] == x) {
++pos;
}
g << pos + 1 << '\n';
} if (op == 2) {
int pos = upper(v, x);
while (pos > 0 && v[pos-1] == x) {
--pos;
}
g << pos + 1 << '\n';
}
}
f.close();
g.close();
return 0;
}