Cod sursa(job #2761651)

Utilizator VladCaloVlad Calomfirescu VladCalo Data 3 iulie 2021 10:49:18
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin("rmq.in");
ofstream fout("rmq.out");
 
int RMQ[20][100001],n,m,stg,dr;

int minim(int stg,int dr)
{
    int k=0, pow=1;
    while (pow*2<=dr-stg+1)
    {
        k++;
        pow*=2;    //put cauta cea mai mare putere a lui 2 mai mica decat lungimea intervalului dat
    }
    return min(RMQ[k][stg], RMQ[k][dr-pow+1]);   //valoarea minima de pe linia aferenta
 
}

int main()
{
    int p,i;
    fin>>n>>m;
    for (int i=1; i<=n; i++)
        fin>>RMQ[0][i]; // numerele citite se afla pe prima linie
    p=2; i=1;
    while(p<=n){
        for (int j=1; j<=n; j++)
            RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+p/2]); 
            ///generam tabelul si memoram pe urmatoarele linii minimele  mergand prin puteri ale lui 2
        p*=2;
        i++;
    }                                             

    for (int i=1; i<=m; i++){
        fin>>stg>>dr;
        fout<<minim(stg,dr)<<endl;
    }
    return 0;
}