Pagini recente » Cod sursa (job #1577550) | Cod sursa (job #3258625) | Cod sursa (job #2894864) | Cod sursa (job #367260) | Cod sursa (job #154858)
Cod sursa(job #154858)
#include <stdio.h>
#define nm 100010
long A[nm];
long M[nm][20];
int Lg[20];
long n, m;
void preproc()
{
int i, j;
for (i=1; i<=n; ++i)
M[i][0]=A[i];
for (j=1; (1<<j)<=n; ++j)
for (int i=1; i+(1<<j)-1<=n; ++i)
if (M[i][j-1]<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];
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld", &n, &m);
int i;
for (i=1; i<=n; ++i) scanf("%ld", A+i);
preproc();
for (i=2; i<=n; ++i) Lg[i]=Lg[i/2]+1;
for (i=1; i<=m; ++i)
{
long x, y;
scanf("%ld%ld", &x, &y);
int k=Lg[y-x+1];
if (M[x][k]<M[y-(1<<k)+1][k])
printf("%ld\n", M[x][k]);
else
printf("%ld\n", M[y-(1<<k)+1][k]);
}
return 0;
}