Cod sursa(job #3253498)

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