Pagini recente » Cod sursa (job #712300) | Cod sursa (job #2964821) | Cod sursa (job #2727437) | Cod sursa (job #2340855) | Cod sursa (job #693178)
Cod sursa(job #693178)
#include <cstdio>
#include <cassert>
#include <algorithm>
#define Nmax 100005
#define Lmax 18
#define InFile "rmq.in"
#define OutFile "rmq.out"
using namespace std;
int n, m;
int T[Nmax], pr[Nmax];
int p2[]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144};
int R[Lmax][Nmax];
void preproc();
int solve(int,int);
int main()
{
int i, x, y;
assert (freopen (InFile, "r", stdin));
assert (freopen (OutFile, "w", stdout));
scanf ("%d %d\n", &n, &m);
for (i=1; i<=n; i++) scanf ("%d ", &T[i]);
for (i=2; i<=n; i++) pr[i]=pr[i/2]+1;
preproc();
for (i=1; i<=m; i++)
{
scanf ("%d %d\n", &x, &y);
printf ("%d\n", solve (x, y));
}
return 0;
}
void preproc()
{
int i, k;
for (i=1; i<=n; i++)
R[0][i]=i;
for (k=1; p2[k]<=n; k++)
for (i=1; i+p2[k]-1<=n; i++)
{
if (T[R[k-1][i]]<T[R[k-1][i+p2[k-1]]])
R[k][i]=R[k-1][i];
else
R[k][i]=R[k-1][i+p2[k-1]];
}
}
int solve (int x, int y)
{
int lg=y-x+1;
return min (T[R[pr[lg]][x]], T[R[pr[lg]][y+1-p2[pr[lg]]]]);
}