Pagini recente » Cod sursa (job #1284279) | Cod sursa (job #1237409) | Cod sursa (job #1822981) | Cod sursa (job #143563) | Cod sursa (job #3253489)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int v[100001],n,m,i,j,k,l,st,dr;
int rmq[100001][21],E[100001];
deque <int> d;
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i],rmq[i][0]=i;
for(i=1;i<=n;i++){
E[i] = 1+E[i/2];
}
for(k=1;k<=20;k++){
l = (1<<k);
if(l>n){
break;
}
for(i=1;i<l;i++){
d.push_back(i);
}
for(i=l;i<=n;i++){
while(!d.empty() && d.front() < i-l+1){
d.pop_front();
}
while(!d.empty() && v[d.back()] >= v[i]){
d.pop_back();
}
if(d.empty()){
d.push_back(i);
rmq[i-l+1][k] = v[i];
}else{
rmq[i-l+1][k] = v[d.back()];
d.push_back(i);
}
}
}
while(m--){
fin>>st>>dr;
k = E[dr-st+1]-1;
l = (1<<k);
fout<<min(rmq[st][k], rmq[dr-l+1][k])<<'\n';
}
return 0;
}