Pagini recente » Istoria paginii runda/pregatire_oni2011_runda1/clasament | Monitorul de evaluare | Cod sursa (job #1570883) | Cod sursa (job #2561556) | Cod sursa (job #2452056)
#include <stdio.h>
#define MAX_N 1000000
#define MAXLN 19
int num[MAX_N];
int minPoz[MAX_N][MAXLN + 1];
int Log( int n ){
int logn;
logn = MAXLN;
while( 1 << logn > n )
logn--;
return logn;
}
int main(){
FILE *fin = fopen("rmq.in", "r");
FILE *fout = fopen("rmq.out", "w");
int n, num_q, i, l, logn, x, y, len;
fscanf(fin, "%d%d", &n, &num_q);
for( i = 0 ; i < n ; i++ )
fscanf(fin, "%d", &num[i]);
logn = Log(n);
for( l = 0 ; l <= logn ; l++ )
for( i = 0 ; i < n - (1 << l) + 1 ; i++ )
minPoz[i][l] = l == 0 ? i : num[minPoz[i][l - 1]] < num[minPoz[i + (1 << (l - 1))][l - 1]] ? minPoz[i][l - 1] : minPoz[i + (1 << (l - 1))][l - 1];
for( i = 0 ; i < num_q ; i++ ){
fscanf(fin, "%d%d", &x, &y);
x--;
y--;
len = y - x + 1;
l = Log(len);
fprintf(fout, "%d\n", num[minPoz[x][l]] < num[minPoz[x + len - (1 << l)][l]] ? num[minPoz[x][l]] : num[minPoz[x + len - (1 << l)][l]]);
}
fclose(fin);
fclose(fout);
return 0;
}