Pagini recente » Cod sursa (job #1971835) | Cod sursa (job #2192471) | Cod sursa (job #1114024) | Cod sursa (job #1494851) | Cod sursa (job #3253496)
#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]=v[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++){
while(!d.empty() && v[d.back()] >= v[i]){
d.pop_back();
}
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();
}
d.push_back(i);
rmq[i-l+1][k] = v[d.front()];
}
}
while(m--){
fin>>st>>dr;
k = E[dr-st+1]-1;
fout<<min(rmq[st][k], rmq[dr-(1<<k)+1][k])<<'\n';
}
return 0;
}