Pagini recente » Cod sursa (job #974080) | Arhiva de probleme | fmi-no-stress-9/solutii | Clasament simulare_oni_hlo_mediu | Cod sursa (job #160149)
Cod sursa(job #160149)
//Range minimum query
#include <stdio.h>
#define INPUT "rmq.in"
#define OUTPUT "rmq.out"
#define MAXN 100001
#define MAXM 1000001
#define MAX 32
#define minim(a,b) ((a)<(b)?(a):(b))
int N, m;
int A[MAXN];
int M[MAX][MAXN]; //M[j][i] - 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[0][i] = A[i];
for(j = 1; 1<<j <= N; ++j)
for(i = 1; i + (1<<j)-1 <= N; ++i)
M[j][i] = minim(M[j-1][i], M[j-1][i+(1<<j-1)]);
for(i = 1; i <= m; ++i)
{
int x,y;
scanf("%d %d", &x, &y);
int k = lg[y-x+1];
printf("%d\n", minim(M[k][x], M[k][y-(1<<k)+1]));
}
return 0;
}