Pagini recente » Cod sursa (job #934197) | Cod sursa (job #2507773) | Cod sursa (job #1767131) | Cod sursa (job #1585793) | Cod sursa (job #2154012)
#include <cstdio>
using namespace std;
#define NMAX 100005
int n, m, log2[NMAX], v[NMAX], mat[NMAX][25];
void build(){
int i, j;
for(i=1; i<=n; i++)
mat[i][0] = i;
for(j=1; j<=log2[n]; j++){
for(i=1; i<=n; i++){
if(v[ mat[i][j - 1] ] <= v[ mat[i + (1 << (j-1))][j - 1] ])
mat[i][j] = mat[i][j - 1];
else mat[i][j] = mat[i + (1 << (j-1))][j - 1];
}
}
}
int rmq(int i, int j){
int rez, k, l;
l = j - i + 1;
k = log2[l];
if(v[ mat[i][k] ] >= v[ mat[j - l + 2][k] ])
rez = mat[j - l + 2][k];
else rez = mat[i][k];
return rez;
}
int main(){
log2[0] = -1;
int i, j, x, y;
FILE *fin, *fout;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(i=1; i<=n; i++){
fscanf(fin, "%d ", &v[i]);
log2[i] = log2[i/2] + 1;
}
build();
for(i=1; i<=m; i++){
fscanf(fin, "%d %d", &x, &y);
fprintf(fout, "%d\n", v[ rmq(x, y) ]);
}
return 0;
}