Cod sursa(job #2684685)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 14 decembrie 2020 15:55:41
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
const int N=1e5+5;
int v[N],r[20][N],n,pow[17],log2[1002];
int main()
{
    int m;
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        f>>v[i];
    }
    int lim=0,p=1;
    while(p<=n)
    {
        pow[lim]=p;
        lim++;
        p=p*2;
    }
    lim--;
    for(int i=1;i<=n;i++)
    {
        r[0][i]=v[i];
    }
    for(int k=1;k<=lim;k++)
    {
        for(int i=1;i<=n;i++)
        {
            r[k][i]=min(r[k-1][i],r[k-1][i+pow[k-1]]);
        }
    }
    log2[1]=0;
    for(int i=2;i<=n;i++)
    {
        log2[i]=log2[i/2]+1;
    }
    for(int i=1;i<=m;i++)
    {
        int st,dr;
        f>>st>>dr;
        int l=dr-st+1,exp;
        exp=log2[l];
        g<<min(r[exp][st],r[exp][dr-pow[exp]+1])<<"\n";
    }
    return 0;
}