Cod sursa(job #2986163)

Utilizator alex_dacDumitrascu Constantin Alexandru alex_dac Data 27 februarie 2023 20:37:26
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include<bits/stdc++.h>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

long long n,r[20][10005],E[100],m;

void citire(){
    in>>n>>m;
    for(int i=1;i<=n;i++)
        in>>r[0][i];
}

void precalc(){
    int p;
    for(p=1;(1<<p)<=n;p++)
    for(int i=1;i<=n;i++){

        r[p][i]=r[p-1][i];
        int j=i+(1<<(p-1));
        if(j<=n and r[p][i]>r[p-1][j])
            r[p][i]=r[p-1][j];
    }
    E[1]=0;
    for(int i=2;i<=n;i++)
        E[i]=1+E[i/2];
}

int interogare(pair<int,int> interval){
    int e=E[interval.second-interval.first+1];
    int len=(1<<e);
    return min(r[e][interval.first],r[e][interval.second-len+1]);
}

int main(){
    citire();
    precalc();

    int st,dr;
    for(int i=1;i<=m;i++){
        in>>st>>dr;
        out<<interogare({st,dr})<<"\n";
    }
}