Cod sursa(job #2776492)

Utilizator Emilia23Dobra Emilia Emilia23 Data 20 septembrie 2021 08:00:37
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.73 kb
#include <iostream>

using namespace std;

//ifstream f("rmq.in");
//ofstream g("rmq.out");

int n,m,rmq[20][100005],st,dr,e[100005],p[20];

void precalculare()
{
    int x=2,y=1;

    while(x<=n)
    {
        for(int i=1;i<=n-x+1;i++)
            rmq[y][i]=min(rmq[y-1][i],rmq[y-1][i+x/2]);
        x*=2;
        y++;
    }
}

int main()
{
    cin>>n>>m;

    for(int i=1;i<=n;i++)cin>>rmq[0][i];

    precalculare();

    int x=1,y=0;
    for(int i=1;i<=n;i++)
    {
        if(x*2==i)x*=2,y++;
        e[i]=y;
        p[y]=x;
    }

    int a,b;
    for(int i=1;i<=m;i++)
    {
        cin>>st>>dr;
        a=e[dr-st+1];
        b=p[a];
        cout<<min(rmq[a][st],rmq[a][dr-b+1])<<'\n';
    }
}