Cod sursa(job #2753982)

Utilizator SofeiAndreiSofei Andrei SofeiAndrei Data 24 mai 2021 20:19:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n,m,I,putere_2,a,b,dif,Min;
int rmq[17][100001];//17 linii deoarece log2(100001)<17 adica avem posibilitatea de a impartii in 17 puteri ale lui 2 ( 2^0 - 2^16 );
using namespace std;
int main ()
{
    f>>n>>m;
    for(int i=1;i<=n;i++){
        f>>rmq[0][i];
    }
    I=0;
    putere_2=2;
    while(putere_2<n){
        I++;
        for(int i=1;i<=n-putere_2/2;i++){
            rmq[I][i]=min(rmq[I-1][i],rmq[I-1][i+putere_2/2]);
        }
        for(int i=n-putere_2/2+1;i<=n;i++){
            rmq[I][i]=rmq[I-1][i];
        }
        putere_2=putere_2*2;
    }
    for(int i=1;i<=m;i++){
        f>>a>>b;
        dif=b-a+1;
        Min=100001;
        while(dif>0){
            putere_2=1;
            I=0;
            while(putere_2*2<=dif){
                putere_2=putere_2*2;
                I++;
            }
            Min=min(Min,rmq[I][a]);
            a=a+putere_2;
            dif=dif-putere_2;
        }
        g<<Min<<'\n';
    }
    return 0;
}