Pagini recente » Cod sursa (job #2379208) | Cod sursa (job #2265152) | Cod sursa (job #690203) | Cod sursa (job #1066171) | Cod sursa (job #514784)
Cod sursa(job #514784)
#include<stdio.h>
FILE*f=fopen("rmq.in","r");
FILE*g=fopen("rmq.out","w");
int N,Q,j,i,p2[20],E[100100],M[18][100100],e,a,b,R;
int min ( int a, int b ){
if( a < b )
return a;
return b;
}
int main () {
fscanf(f,"%d %d",&N,&Q);
for ( i = 1 ; i <= N ; ++i ){
fscanf(f,"%d",&M[0][i]);
E[i + 1] = E[(i+1)/2] + 1;
}
for ( p2[0] = i = 1 ; p2[i-1] <= 100005; p2[i] = 2 * p2[i-1] , ++i ){}
// M[i][j] = minimul din secventa care incepe la pozitia i si are lungime 2 ^ j
for ( j = 1 ; j <= E[N] ; ++j ){
for ( i = 1 ; i + p2[j] <= N + 1; ++i )
M[j][i] = min(M[j-1][i],M [ j - 1][ i + p2[j-1]] );
}
while ( Q-- ){
fscanf(f,"%d %d",&a,&b);
e = E[b - a + 1];
// e = exponentul celei mai mari puteri de 2 <= b - a + 1
R = min(M[e][a],M[ e ] [ b - p2[e] + 1 ] ) ;
fprintf(g,"%d\n",R);
}
fclose(f);
fclose(g);
return 0;
}