Cod sursa(job #3253496)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 2 noiembrie 2024 21:54:54
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#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;
}