Pagini recente » Rating Stefan Malanik (stefanmalanik) | Istoria paginii utilizator/iasmina_ignuta | Monitorul de evaluare | Cod sursa (job #2425755) | Cod sursa (job #1760366)
#include <fstream>
using namespace std;
ofstream rez("cautbin.out");
ifstream inf("cautbin.in");
int *a, n, steps, step, lastpoz;
citire() {
inf>>n;
for (int i=0; i<n; i++)
inf>>a[i];
}
int caut_bin(int st, int dr) {
if (a[dr] == step) return dr;
if (a[st] == step) return st;
if (st==dr) return -1;
int m = (st + dr) / 2;
lastpoz = m;
if (a[m]>=step) return caut_bin(m,dr);
if (a[m]<=step) return caut_bin(st,m);
}
int step_0(int poz) {
if (poz<0) return -1;
int val = a[poz];
for (int i=poz; i<n; i++) {
if (a[i]!=val) return i-1;
}
}
int step_1() {
int exists = caut_bin(0, n);
if (exists>=0) {
return step_0(exists);
} else {
for (int i=lastpoz; i>=0; i--)
if (a[i]<step) return a[i];
}
}
int step_2() {
int exists = caut_bin(0, n);
if (exists>=0) {
for (int j=0; j<=exists; j++)
if (a[j]==a[exists]) return j;
} else {
for (int i=lastpoz; i<n; i++)
if (a[i]>step) return a[i];
}
}
int main(){
a = new int;
int condition;
citire();
inf>>steps;
for (int j=0; j<steps; j++) {
inf>>condition;
inf>>step;
switch (condition) {
case 0: rez<<step_0(caut_bin(0,n))+1<<endl; break;
case 1: rez<<step_1()+1<<endl; break;
case 2: rez<<step_2()+1; break;
}
}
rez.close();
inf.close();
return 0;
}