Pagini recente » Cod sursa (job #2433836) | Cod sursa (job #2798808) | Cod sursa (job #976563) | Cod sursa (job #339784) | Cod sursa (job #1087491)
#include <cstdio>
#include <cmath>
using namespace std;
#define NMAX 100005
#define LogNMAX 20
#define minim(a,b) ((a<b)?(a):(b))
int N,Q;
int A[NMAX],M[NMAX][LogNMAX];
void ContructRMQ()
{
for(int i=1;i<=N;i++)
M[i][0] = i;
int i,j,minUntilNowPos,minOnSecondSegmentPos;
for(j=1; (1<<j) <= N; j++)
for(i=1;i + (1<<j) - 1 <=N;i++)
{
minUntilNowPos = M[i][j-1];
minOnSecondSegmentPos = M[i + (1<<(j-1))][j-1];
if(A[minUntilNowPos]<=A[minOnSecondSegmentPos])
M[i][j] = minUntilNowPos;
else
M[i][j] = minOnSecondSegmentPos;
}
}
int Query(int x, int y)
{
int k = (int) log2(double(y-x+1));
int minOnFirstSegmentPos,minOnSecondSegmentPos;
minOnFirstSegmentPos = M[x][k];
minOnSecondSegmentPos = M[y - (1<<k) + 1][k];
return minim(A[minOnFirstSegmentPos],A[minOnSecondSegmentPos]);
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&N,&Q);
for(int i=1;i<=N;i++)
scanf("%d",&A[i]);
ContructRMQ();
int x,y;
for(int i=1;i<=Q;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",Query(x,y));
}
return 0;
}