Cod sursa(job #3216851)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 20 martie 2024 08:56:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#include <vector>
#define NMAX 100008
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,q;
int a[NMAX];
int log(int val);
int rmq[NMAX][30];
int main()
{
    fin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    for(int i=1;i<=n;i++)
        rmq[i][0]=i;
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            if(a[rmq[i][j-1]]<a[rmq[i+(1<<(j-1))][j-1]])
                rmq[i][j]=rmq[i][j-1];
            else
                rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
    for(int i=1;i<=q;i++)
    {
        int x,y;
        fin>>x>>y;
        int aux=y-x+1;
        aux=log(aux);
        fout<<min(a[rmq[x][aux]],a[rmq[y-(1<<aux)+1][aux]])<<'\n';
    }
    return 0;
}
int log(int val)
{
    if(val==1)
        return 0;
    return 1+log(val/2);
}