Pagini recente » Cod sursa (job #2436424) | Cod sursa (job #3171069) | Cod sursa (job #266527) | Cod sursa (job #11539) | Cod sursa (job #513913)
Cod sursa(job #513913)
#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[100100][20],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[i][j] = INF;
for ( i = 1 ; i <= N ; ++i ){
fscanf(f,"%d",&A[i]);
M[i][0] = 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 + 1] ; ++j ){
for ( i = 1 ; i <= N ; ++i )
M[i][j] = min(M[i][j-1],M[ i + p2[j-1] ][ 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[a][e],M[ b - p2[e] + 1 ] [ e ] ) ;
fprintf(g,"%d\n",R);
}
fclose(f);
fclose(g);
return 0;
}