Cod sursa(job #2901145)

Utilizator Andoss1710Balanica Andrei Andoss1710 Data 13 mai 2022 04:40:38
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include<fstream>
using namespace std;

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

//int Segtree[500001], N, v[100001];
//
//void adaugare(long long int nod, long long int poz, long long int left, long long int right){
//    if(left > poz || right < poz)
//        return;
//    if(left == right){
//        Segtree[nod] = v[poz];
//        return;
//    }
//    adaugare(nod*2, poz, left, (left+right)/2);
//    adaugare(nod*2+1, poz, (left+right)/2+1, right);
//    Segtree[nod] = min(Segtree[nod*2], Segtree[nod*2+1]);
//}
//
//int minim(int nod, int left, int right, int s, int r){
//    if(s > right || left > r)
//            return 100001;
//    if(s<=left && r>=right){
//        return Segtree[nod];
//    }
//    return min(minim(nod*2, left, (right+left)/2, s , r) , minim(nod*2+1, (right+left)/2+1, right, s, r));
//
//}


//    for(j = 1; j <= N; j++){
//        adaugare(1,j,1, N);
//    }
//
//    for(long long int i = 0; i<M; i++){
//        long long int l, r;
//        fin>>l>>r;
//        fout<<minim(1, 1, N, l, r)<<"\n";
//
//    }

int main()
{
    int M, N;
    fin>>N>>M;
    int rmq[100001][100001], v[100001];
    for(int i = 1; i<=N; i++){
        fin>>v[i];
        rmq[i][i] = i;
    }
    for(int i = 1; i<N; i++)
    for(int j = i+1; j<=N; j++){
        if(v[rmq[i][j-1]] < v[j] )
            rmq[i][j] = rmq[i][j-1];
        else
            rmq[i][j] = j;
    }
    for(int i = 1; i<=M; i++){
        int left, right;
        fin>>left>>right;
        fout<<v[rmq[left][right]]<<"\n";
    }
}