Pagini recente » Cod sursa (job #2703277) | Cod sursa (job #1295075) | Cod sursa (job #722998) | Cod sursa (job #1646735) | Cod sursa (job #1357881)
#include <cstdio>
using namespace std;
const int nmax=100001,logmax=18;
int A[nmax],D[nmax][logmax],N,Q,Log[nmax];
void constr() {
Log[1]=0;
for (int i=2;i<=N;i++)
Log[i]=Log[i/2]+1;
for (int i=0;i<N;i++)
D[i][0]=i;
for (int j=1;(1<<j)<=N;j++)
for (int i=0;i+(1<<j)-1<N;i++)
if (A[D[i][j-1]]<A[D[i+(1<<(j-1))][j-1]]) D[i][j] = D[i][j-1];
else D[i][j]=D[i+(1<<(j-1))][j-1];
}
int query(int i, int j) {
int k=Log[j-i+1];
if (A[D[i][k]]<=A[D[j-(1<<k)+1][k]]) return D[i][k];
else return D[j-(1<<k)+1][k];
}
int main () {
FILE *in = fopen("rmq.in", "r"), *out = fopen("rmq.out", "w");
if (in && out) {
fscanf(in, "%d %d\n", &N, &Q);
for (int i = 0; i < N; i++)
fscanf(in, "%d\n", A + i);
constr();
int x, y;
for (int i=0;i<Q;i++) {
fscanf(in, "%d %d\n", &x, &y);
fprintf(out, "%d\n", A[query(x-1,y-1)]);
}
fclose(in);
fclose(out);
}
return 0;
}