Pagini recente » Cod sursa (job #1376094) | Cod sursa (job #1037276) | Cod sursa (job #2661225) | Cod sursa (job #144223) | Cod sursa (job #2901536)
#include <iostream>
#include<fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
//int Segtree[500001], N, v[100001];
//
//void adaugare(long long int nod, long long int poz, long long int left, long long int right){
// if(left > poz || right < poz)
// return;
// if(left == right){
// Segtree[nod] = v[poz];
// return;
// }
// adaugare(nod*2, poz, left, (left+right)/2);
// adaugare(nod*2+1, poz, (left+right)/2+1, right);
// Segtree[nod] = min(Segtree[nod*2], Segtree[nod*2+1]);
//}
//
//int minim(int nod, int left, int right, int s, int r){
// if(s > right || left > r)
// return 100001;
// if(s<=left && r>=right){
// return Segtree[nod];
// }
// return min(minim(nod*2, left, (right+left)/2, s , r) , minim(nod*2+1, (right+left)/2+1, right, s, r));
//
//}
// for(j = 1; j <= N; j++){
// adaugare(1,j,1, N);
// }
//
// for(long long int i = 0; i<M; i++){
// long long int l, r;
// fin>>l>>r;
// fout<<minim(1, 1, N, l, r)<<"\n";
//
// }
int rmq[17][100001], v[100001], log2[100001];
int main()
{
int M, N;
fin>>N>>M;
for(int i = 1; i<=N; i++){
fin>>v[i];
rmq[0][i] = i;
}
int power = 0, p2 = 1;
for(int i = 1; i<=N; i++){
if(i == p2){
p2 = p2*2;
power++;
}
log2[i] = power-1;
}
int putere = 2;
for(int i = 1; i<=log2[N]; i++){
for(int j = 1; j<=N-putere+1; j++){
if(v[rmq[i-1][j]] < v[rmq[i-1][j+putere/2]])
rmq[i][j] = rmq[i-1][j];
else
rmq[i][j] = rmq[i-1][j+putere/2];
}
putere = putere *2;
}
for(int i = 1; i<=M; i++){
int left, right, mid;
fin>>left>>right;
mid = log2[(right-left+1)];
if(v[rmq[mid][left]] < v[rmq[mid][right-(1<<mid)+1]])
fout<<v[rmq[left][left]]<<"\n";
else
fout<<v[rmq[mid][right-(1<<mid)+1]]<<"\n";
}
}