Pagini recente » Cod sursa (job #1362249) | Cod sursa (job #1052548) | Cod sursa (job #114718) | Profil DamianAndrei | Cod sursa (job #3253498)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int v[100001],n,m,i,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=2;i<=n;i++){
E[i] = 1+E[i/2];
}
for(k=1;k<=20;k++){
l = (1<<k);
if(l>n){
break;
}
d.clear();
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];
fout<<min(rmq[st][k], rmq[dr-(1<<k)+1][k])<<'\n';
}
return 0;
}