Cod sursa(job #2880674)

Utilizator sebisincariSincari Sebastian sebisincari Data 29 martie 2022 23:29:33
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,m;
int a[18][100005];
int ex[100005];//exponentul celei mai mari puteri de 2 mai mică sau egală cu i
//prin folosirea algoritmului rmq in matrice pe poz p,i 
//vom avea min din secventa ce incepe pe poz i si lungime 2^p 
void rmq()
{
    int i,j,poz;
    for(i=1;(1<<i)<=n;i+=1)
        for(j=1;j<=n;j+=1)
        {
            a[i][j]=a[i-1][j];
            poz=j+(1<<(i-1));
            if(poz<=n and a[i-1][poz]<a[i][j])
                a[i][j]=a[i-1][poz];
        }
    
    
    int e=0;
    ex[1]=0;
    for(i=2;i<=n;i+=1)
    {
        if(1<<(e+1)<=i)
            ex[i]=e+1,e+=1;
        else
            ex[i]=e;
    }
    /*
    for(i=0;(1<<i)<=n;i+=1)
    {
        for(j=1;j<=n;j+=1)
            fout<<a[i][j]<<' ';
        fout<<endl;
    }
    for(i=1;i<=n;i+=1)
        fout<<ex[i]<<' ';
    */
}
void in()
{
    fin>>n>>m;
    int i;
    for(i=1;i<=n;i+=1)
        fin>>a[0][i];
    rmq();
    int x,y,lin,sar;
    for(i=1;i<=m;i+=1)
    {
        fin>>x>>y;
        lin=ex[y-x+1];
        sar=(1<<lin);
        fout<<min(a[lin][x],a[lin][y-sar+1])<<endl;
    }
}
int main()
{
    in();
    return 0;
}