Cod sursa(job #2543761)

Utilizator marius004scarlat marius marius004 Data 11 februarie 2020 15:00:30
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
using namespace std;


std::ifstream f("rmq.in");
std::ofstream g("rmq.out");

const int NMAX = 100005;
int n,query,l[NMAX],rmq[20][NMAX],x,y;

int main(){

    f >> n >> query;

    for(int i = 1;i <= n;++i)
        f >> rmq[0][i];

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

///     cout<<l[n]<<"\n";

    // precalculez rmq
    for(int i = 1;i <= l[n];++i){
        for(int j = 1;j <= n;++j){
            rmq[i][j] = rmq[i - 1][j];
            int e = i - 1;
            int ind = j + (1 << e);
            if(ind <= n && rmq[i][j] > rmq[i - 1][ind])
                rmq[i][j] = rmq[i - 1][ind];
        }
    }
/**
    for (int i=0;i<=2;i++) {
        for (int j=1;j<=n;j++)
            cout<<rmq[i][j]<<" ";
        cout<<"\n";
    }
**/

    //afisam in O(1) rezulattul la query-uri
    while(query--){

        f >> x >> y;

        int len = (y - x + 1);
///        cout<<rmq[l[len]][x]<<" "<<rmq[l[len]][y - (1 << len) + 1]<<"\n";
///        cout<<l[len]<<"\n";
        g << std::min(rmq[l[len]][x],rmq[l[len]][y - (1 << l[len]) + 1]) << '\n';
    }

    return 0;
}