Pagini recente » Cod sursa (job #1588690) | Cod sursa (job #2409536) | Cod sursa (job #2843777) | Cod sursa (job #274487) | Cod sursa (job #2406368)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
const int NMAX = 100001;
int sir[NMAX], N, M;
int cautareBinara(int v[], int st, int dr, int valoare) {
while (st <= dr) {
int m = (st + dr) / 2;
if (v[m] == valoare)
return m;
else if (v[m] > valoare)
dr = m - 1;
else
st = m + 1;
}
return -1;
}
int ultimaAparitieX(int x) {
int a = 1;
if (cautareBinara(sir, a, N, x) == -1)
return -1;
else
while (cautareBinara(sir, a, N, x) != -1) {
a = cautareBinara(sir, a, N, x) + 1;
}
return a - 1;
}
int pozitieMaximala(int v[], int st, int dr, int valoare) {
while (st <= dr) {
int m = (st + dr) / 2;
if (v[m] <= valoare)
return m;
else
dr = m - 1;
}
return -1;
}
int pozitieMinimala(int v[], int st, int dr, int valoare) {
while (st <= dr) {
int m = (st + dr) / 2;
if (v[m] >= valoare)
return m;
else
st = m + 1;
}
return -1;
}
int main() {
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> sir[i];
fin >> M;
for (int i = 0; i < M; ++i) {
int operatie, x, a, k;
fin >> operatie >> x;
switch (operatie) {
case 0:
fout << ultimaAparitieX(x) << "\n";
break;
case 1:
a = 1;
while (pozitieMaximala(sir, a, N, x) != -1) {
cout << "MAXIMAL" << endl;
a = pozitieMaximala(sir, a, N, x) + 1;
}
fout << a - 1 << "\n";
break;
case 2:
a = N;
int k;
while (pozitieMinimala(sir, 1, a, x) > 0) {
k = pozitieMinimala(sir, 1, a, x);
a = k - 1;
}
fout << k << "\n";
break;
default:
break;
}
}
fin.close();
fout.close();
return 0;
}