Cod sursa(job #3133954)

Utilizator stefanmo03Mocanu Stefan stefanmo03 Data 27 mai 2023 18:51:06
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
//#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
std::ifstream cin("rmq.in");
std::ofstream cout("rmq.out");

int _2la_x(int val){
    if(val == 0) return 1;
    return 1<<val;
}
int log2(int val){
    if(val == 0 || val == 1)return 0;
    return 1 + log2(val>>1);
}
int main() {
    long long n, m;
    vector<long long> numbers;
    cin>>n>>m;
    for(long long i=0;i<n;i++){
        long long aux;
        cin>>aux;
        numbers.push_back(aux);
    }
    long long log2n = log2(n);
    long long **rmq = new long long*[n];
    for(int i = 0; i<n;i++){
        rmq[i] = new long long[log2n+1];
    }
    for(long long i = 0; i<n;i++){
        rmq[i][0] =numbers[i];
    }
    for(long long j = 1; _2la_x(j)-1 < n ; j++){
        for(long long i=0; i + (_2la_x(j))-1 < n; i++){
            if(rmq[i][j-1] < rmq[i + (_2la_x(j - 1))][j-1])
                rmq[i][j] = rmq[i][j-1];
            else
                rmq[i][j] = rmq[i + (_2la_x(j - 1))][j-1];
        }
    }
    for(long long i =0; i<m;i++){
        long long x,y;
        cin>>x>>y;
        long long k=log2(y-x+1);
        if(rmq[x-1][k] <= rmq[y - _2la_x(k)][k])
            cout<<rmq[x-1][k]<<"\n";
        else
            cout<<rmq[y- _2la_x(k)][k]<<"\n";

    }
    for(long long i = 0; i<n;i++){
        delete[] rmq[i];
    }
    delete[] rmq;
    return 0;
}