Pagini recente » Cod sursa (job #592655) | Cod sursa (job #244801) | Cod sursa (job #1832260) | Cod sursa (job #1486761) | Cod sursa (job #1789737)
#include <fstream>
#include <vector>
using namespace std;
vector<int> vec;
int pozEqual(int x, int n) {
int st = 0, dr = n - 1, mij;
while (st <= dr) {
mij = st + ((dr - st) >> 1);
if (vec[mij] == x) {
int i = mij + 1;
while (vec[i++] == vec[mij]);
return i - 1;
}
else if (vec[mij] < x) {
st = mij + 1;
}
else {
dr = mij - 1;
}
}
return -1;
}
int pozMax(int x, int n) {
int st = 0, dr = n - 1, mij;
while (st <= dr) {
mij = st + ((dr - st) >> 1);
if (mij == n - 1 || (vec[mij] <= x && vec[mij + 1] > x)) {
return mij;
}
else if (vec[mij] > x && vec[mij - 1] <= x) {
return mij - 1;
}
else if (vec[mij] > x) {
dr = mij - 1;
}
else {
st = mij + 1;
}
}
}
int pozMin(int x, int n) {
int st = 0, dr = n - 1, mij;
while (st <= dr) {
mij = st + ((dr - st) >> 1);
if (mij == 0 || (vec[mij] >= x && vec[mij - 1] < x)) {
return mij;
}
else if (vec[mij] < x && vec[mij + 1] >= x) {
return mij + 1;
}
else if (vec[mij] < x) {
st = mij + 1;
}
else {
dr = mij - 1;
}
}
}
int main() {
int n, m, question, x;
ifstream in("cautbin.in");
in >> n;
for (int i = 0; i < n; ++i) {
in >> x;
vec.push_back(x);
}
in >> m;
ofstream out("cautbin.out");
for (int i = 0; i < m; ++i) {
in >> question >> x;
switch (question) {
case 0: {
out << pozEqual(x, n) << '\n';
break;
}
case 1: {
out << pozMax(x, n) + 1 << '\n';
break;
}
case 2: {
out << pozMin(x, n) + 1 << '\n';
break;
}
}
}
in.close();
out.close();
return 0;
}