Pagini recente » Cod sursa (job #370612) | Cod sursa (job #2871296) | Cod sursa (job #614081) | Cod sursa (job #912341) | Cod sursa (job #690127)
Cod sursa(job #690127)
#include <cstdio>
#include<algorithm>
#define infile "rmq.in"
#define outfile "rmq.out"
#define n_max 100005
#define log_max 18
using namespace std;
int A[n_max], log[n_max];
int RMQ [n_max][log_max];
int N, M;
void MakeRMQ()
{
for(int i=2; i<=N; ++i)
log[i] = log[i>>1] + 1;
for(int i=0; i<N; ++i)
RMQ[i][0] = i;
for(int j = 1; (1<<j) <= N; ++j)
for(int i=0; (i + (1<<j) - 1) < N; ++i)
if(A[RMQ[i][j-1]] < A[RMQ[i + (1<<(j-1))][j-1]])
RMQ[i][j] = RMQ[i][j-1];
else
RMQ[i][j] = RMQ[i + (1<<(j-1))][j-1];
}
int main()
{
freopen(infile, "r", stdin);
freopen(outfile, "w", stdout);
int x, y;
scanf("%d %d", &N, &M);
for(int i=0;i<N;i++)
scanf("%d",&A[i]);
MakeRMQ();
while(M--)
{
scanf("%d %d", &x, &y);
x--;
y--;
int k = log[y - x +1] ;
printf("%d\n", min(A[RMQ[x][k]], A[RMQ[y - (1<<k) + 1][k]]));
}
fclose(stdin);
fclose(stdout);
return 0;
}