Cod sursa(job #2812101)

Utilizator dana24hdDana N dana24hd Data 3 decembrie 2021 22:36:32
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

const int NMAX=100002;
long long RMQ[20][NMAX];
//int put_max_2[100000]; /// puterea max a lui 2 dintr-un numar

/*
void Update( int st, int dr, int k ){

    int put_2 = put_max_2[dr-st+1];
    RMQ[put_2][st] = max( RMQ[put_2][st], k );
    RMQ[put_2][dr - ( 1<<put_2) + 1] = max( RMQ[put_2][dr - (1<<put_2) + 1], k );

} */

void Propagate(int n){

    for(int i=1; i<=20; i++){
        for(int j=1; j + (1<<i) -1 <= n; j++){
            int l=(1<<(i-1));
            RMQ[i][j] = min( RMQ[i-1][j], RMQ[i-1][j+l] );
            //RMQ[i-1][j + (1<<(i-1))] = max( RMQ[i-1][j+(1<<(i-1))], RMQ[i][j] );
        }
    }

}

int Query( int poz ){
    return RMQ[0][poz];
}

/*
int rmq[NMAX][LGMAX];
, n;

void ComputeRMQ(){

    for(int i=0; i<n; i++)
        rmq[0][i]=v[i];

    for(int i=1; i<LGMAX; i++){
        for(int j=0; j+(1<<i)<=n; j++){
            rmq[i][j]=max( rmq[i][j], rmq[i-1][j+( 1<<(i-1) ) ] );
        }
    }

} */

long long v[NMAX];
long long lg[NMAX];

int main()
{

    int n, m;
    in>>n>>m;

    for(int i=1; i<=n; i++){
        in>>v[i];
        RMQ[0][i]=v[i];
    }

    lg[1]=0;
    for(int i=2; i<=n; i++)
        lg[i]=lg[i/2]+1;

    Propagate(n);

    int st, dr;
    for(int i=0; i<m; i++){
        in>>st>>dr;

        long long l = lg[ dr-st+1 ];
        long long rez = dr-st+1 - (1<<l);

        out<<min( RMQ[1][st], RMQ[1][st+rez] )<<'\n';

    }




    return 0;
}