Cod sursa(job #2543733)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 11 februarie 2020 14:36:45
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define K 100003
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,m,i,j,x,y,lg,exponent,e,d[K][20],puteri[K];
///puteri[i] = exponentul celei mai apropiate puteri de 2 <= i
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>d[0][i];
    for(i=2;i<=n;i++)
        puteri[i]=1+puteri[i/2];
    lg=puteri[n];
    for(e=1;e<=lg;e++)
        for(i=1;i<=n;i++)
            d[e][i]=min(d[e-1][i],d[e-1][i+(1<<(e-1))]);
/** d[e][i] = minimul dintr o secventa inceputa pe pozitia i de lungime 2^e
    minimul pe o secv de lg 2^e se obtine din cele 2 secv de lg 2^(e-1) de deasupra ei */
    for(;m--;){
        fin>>x>>y;
        lg=y-x+1;
        exponent=puteri[lg];
/** minimul pe [x,y] este continut ori in secventa de lungime 2^exponent inceputa la poz x
    ori terminata la poz y (tot de lungime 2^exponent); exponent fiind cea mai apropiata putere
    de 2 <= lg => cele 2 secvente sigur se intersecteaza (prima secv trece de jumatatea intervalului)*/
        fout<<min(d[exponent][x],d[exponent][y-(1<<exponent)+1])<<"\n";
    }
    return 0;
}