Cod sursa(job #2754841)

Utilizator Zamolxis25Sebastian Gradinaru Zamolxis25 Data 26 mai 2021 16:31:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>

using namespace std;

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

int N,M, MinArb[400020], start, finish, val, pos, minim;

inline int Minim(int a, int b) {
    if ( a < b ) return a;
    return b;
}

void Update(int nod, int left, int right){
    if(left == right){
        MinArb[nod] = val;
        return;
    }

    int div = (left+right)/2;
    if(pos <= div) Update(2*nod, left, div);
    else Update(2*nod+1, div+1, right);

    MinArb[nod] = Minim(MinArb[2*nod], MinArb[2*nod+1]);
}

void Query(int nod, int left, int right){
    if(start <= left && right <= finish){
        if(minim > MinArb[nod]) minim = MinArb[nod];
        return;
    }

    int div = (left + right)/2;
    if(start <= div) Query(2*nod, left, div);
    if(div < finish) Query(2*nod+1, div+1, right);
}

int main(){

    int A, B;

    fin>>N>>M;
    for(int i = 1; i<=N; i++){
        fin>>A;
        pos = i, val = A;
        Update(1,1,N);
    }
    for(int i = 1; i<=M; i++){
        fin>> A >> B;

        minim = 100001;
        start = A, finish = B;
        Query(1,1,N);

        fout<<minim<<"\n";
    }

    return 0;
}