Pagini recente » Cod sursa (job #196604) | Cod sursa (job #1220083) | Cod sursa (job #641260) | Cod sursa (job #142943) | Cod sursa (job #834081)
Cod sursa(job #834081)
#include <cstdio>
using namespace std;
const int NMAX = 100001;
const int MMAX = 100001;
const char IN[] = "cautbin.in";
const char OUT[] = "cautbin.out";
int N, M;
int A[NMAX];
int FirstSearch(int val) {
int step, i;
for(step = 1; step < N; step <<= 1);
for(i = 0; step; step >>= 1)
if(i + step <= N && A[i + step] <= val)
i += step;
if(A[i] == val)
printf("%d\n", i);
else
printf("-1\n");
}
void SecondSearch(int val) {
int step, i;
for(step = 1; step < N; step <<= 1);
for(i = 0; step; step >>= 1)
if(i + step <= N && A[i + step] <= val)
i += step;
printf("%d\n", i);
}
void ThirdSearch(int val) {
int step, pas;
for(step = 1; step < N; step <<= 1);
pas = step;
if(pas > N) pas >>= 1;
if(A[pas] < val) pas = N;
for(; step; step >>= 1)
if(pas - step <= N && pas >= step && A[pas - step] >= val)
pas -= step;
printf("%d\n", pas);
}
int main() {
int i, val, cod;
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
scanf("%d", &N);
for(i = 1; i <= N; ++i)
scanf("%d", &A[i]);
scanf("%d", &M);
for(i = 1; i <= M; ++i) {
scanf("%d %d", &cod, &val);
switch(cod) {
case 0: FirstSearch(val); break;
case 1: SecondSearch(val); break;
case 2: ThirdSearch(val); break;
}
}
return 0;
}