Pagini recente » Cod sursa (job #2483476) | Cod sursa (job #1346181) | Cod sursa (job #153653) | Cod sursa (job #1303368) | Cod sursa (job #677776)
Cod sursa(job #677776)
// Infoarena - Arhiva Educationala Potrivirea Sirurilor
// Februrie 2012 Marius Dumitran
// Rabin Karp O(n+m)
#include<string.h>
#include<stdio.h>
int cauta_exact( int val, int *v, int n,int max) {
int start = 1;
while( max > 0 ) {
if( start + max > n || v[ start + max ] > val ) {
max >>= 1;
continue;
}
start += max;
max >>= 1;
}
if( v[ start ] == val ) return start;
return -1;
}
int cauta_mai_mic( int val, int *v, int n,int max) {
int start = 1;
while( max > 0 ) {
if( start + max > n || v[ start + max ] > val ) {
max >>= 1;
continue;
}
start += max;
max >>= 1;
}
if( v[ start ] <= val ) return start;
return -1;
}
int cauta_mai_mare( int val, int *v, int n,int max) {
int start = n;
while( max > 0 ) {
if( start - max < 1 || v[ start - max ] < val ) {
max >>= 1;
continue;
}
start -= max;
max >>= 1;
}
if( v[ start ] >= val ) return start;
return -1;
}
int main() {
int v[100001];
freopen ("cautbin.in", "r", stdin);
freopen ("cautbin.out", "w", stdout);
int n, m, max = 1;
scanf("%d", &n);
for( int i = 1; i <= n; ++i)
scanf("%d", &v[i]);
while( max <= n ) max <<= 1;
max >>= 1;
scanf("%d", &m);
for( int j = 1; j <= m; ++j) {
int a, b;
scanf("%d %d", &a, &b);
if( a == 0)
printf("%d\n", cauta_exact(b, v, n, max));
if( a == 1)
printf("%d\n", cauta_mai_mic(b, v, n, max));
if( a == 2)
printf("%d\n", cauta_mai_mare(b, v, n, max));
}
return 0;
}