Pagini recente » Cod sursa (job #487098) | Cod sursa (job #891058) | Cod sursa (job #611554) | Cod sursa (job #2532380) | Cod sursa (job #2294736)
#include <iostream>
#include <stdio.h>
using namespace std;
const int NMAX=100001;
int lookup_table[NMAX][18];
int q = 2147483647;
int log[NMAX];
int pow2[18];
int main() {
FILE *fin, *fout;
int v[NMAX];;
int n, i, j, logn, p2, nrquerry, it, x, y, d, rmq;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
fscanf(fin,"%d", &n);
fscanf(fin,"%d", &nrquerry);
for(i=1;i<=n;i++){
fscanf(fin,"%d", &v[i]);
}
pow2[0]=1;
for(i=1;i<=18;i++){
pow2[i]=pow2[i-1]*2;
}
p2=1;
log[1]=0;
for(i=2;i<=n+1;i++){
if(i==2*p2){
p2*=2;
log[i]=log[i-1]+1;
}
else
log[i]=log[i-1];
}
i=1;
logn=0;
while(i<n){
if(i*2<=n){
i*=2;
logn++;
}
else
i*=2;
}
for(i=1;i<=n;i++){
lookup_table[0][i]=v[i];
}
for(i=1;i<=logn;i++){
for(j=1;j<=n-pow2[i]+1;j++){
lookup_table[i][j]=min(lookup_table[i-1][j], lookup_table[i-1][j+(1<<i-1)]);
}
for(j=n-pow2[i]+2;j<=n;j++)
lookup_table[i][j]= q;
}
/*
for(i=0;i<=logn;i++){
for(j=1;j<=n;j++){
if(lookup_table[i][j]!=q)
fprintf(fout,"%d ", lookup_table[i][j]);
else
fprintf(fout,"- ");
}
fprintf(fout,"\n");
}
*/
for(it=1;it<=nrquerry;it++){
fscanf(fin,"%d%d", &x, &y);
d=y-x+1;
rmq=min(lookup_table[log[d-1]][x], lookup_table[log[d-1]][y-(1<<log[d-1])+1]);
fprintf(fout,"%d\n", rmq);
}
fclose(fin);
fclose(fout);
return 0;
}