Pagini recente » Borderou de evaluare (job #224280) | Cod sursa (job #334003) | Cod sursa (job #3161356) | Cod sursa (job #3030979) | Cod sursa (job #160139)
Cod sursa(job #160139)
//Range minimum query
#include <stdio.h>
#define INPUT "rmq.in"
#define OUTPUT "rmq.out"
#define MAXN 100001
#define MAXM 1000001
#define MAX 128
int N, m;
int A[MAXN];
int M[MAXN][MAX]; //indicele elem din A minim in secventa din A ce incepe de pe poz i de lung 2^j
int lg[MAXN];
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
scanf("%d %d", &N, &m);
int i, j;
for(i = 1; i <= N; ++i) scanf("%d", &A[i]);
//Preprocesare
for(i = 2; i <= N; ++i)
lg[i] = lg[i/2] + 1;
for(i = 1; i <= N; ++i)
M[i][0] = i;
for(j = 1; 1<<j <= N; ++j)
for(i = 1; i + (1<<j)-1 <= N; ++i)
if(A[M[i][j-1]] < A[M[i+(1<<j-1)][j-1]])
M[i][j] = M[i][j-1];
else M[i][j] = M[i+(1<<j-1)][j-1];
for(i = 1; i <= m; ++i)
{
int x,y;
scanf("%d %d", &x, &y);
int k = lg[y-x+1];
if(A[M[x][k]] < A[M[y-(1<<k)+1][k]]) printf("%d\n", A[M[x][k]]);
else printf("%d\n", A[M[y-(1<<k)+1][k]]);
}
return 0;
}