Cod sursa(job #3157564)

Utilizator emazareMazare Emanuel emazare Data 15 octombrie 2023 20:40:29
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>

using namespace std;

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

const int Nmax = 100005;
int v[Nmax],expi[Nmax],rmq[20][Nmax];

int main()
{
    int n,q,i,l;
    fin >> n >> q;
    for(i=1;i<=n;i++)
        fin >> v[i];
    expi[1] = 0; expi[2] = 1; l = 4;
    for(i=3;i<=n;i++){
        if(i == l){
            l*=2;
            expi[i] = expi[i-1]+1;
        }
        else
            expi[i] = expi[i-1];
    }
    for(i=1;i<=n;i++)
        rmq[0][i] = v[i];
    for(l=1;l<=expi[n];l++){
        for(i=1;i<=n-l+1;i++)
            rmq[l][i] = min(rmq[l-1][i],rmq[l-1][i+(1<<(l-1))]);
    }
    for(i=0;i<q;i++){
        int x1,x2,e;
        fin >> x1 >> x2;
        e = expi[x2-x1+1];
        fout << min(rmq[e][x1],rmq[e][x2-(1<<e)+1]) << '\n';
    }
    return 0;
}