Pagini recente » Cod sursa (job #2343257) | Cod sursa (job #1179325) | Cod sursa (job #670832) | Cod sursa (job #1414755) | Cod sursa (job #513919)
Cod sursa(job #513919)
#include<stdio.h>
#define INF 1 << 29
FILE*f=fopen("rmq.in","r");
FILE*g=fopen("rmq.out","w");
int N,Q,A[100100],j,i,p2[20],E[100100],M[20][1<<21],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 = 0 ; i <= 100100; ++i )
for ( j = 0 ; j < 20 ; ++j )
M[j][i] = INF;
for ( i = 1 ; i <= N ; ++i ){
fscanf(f,"%d",&A[i]);
M[0][i] = A[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 <= N ; ++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;
}