Cod sursa(job #2901557)

Utilizator Andoss1710Balanica Andrei Andoss1710 Data 14 mai 2022 00:14:36
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include<fstream>

using namespace std;

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

int rmq[18][100001], v[100001], log2[100001];
int main()
{
    int M, N;
    fin>>N>>M;
    for(int i = 1; i<=N; i++){
        fin>>v[i];
        rmq[0][i] = i;
    }
    int power = 0, p2 = 1;
    for(int i = 1; i<=N; i++){
        if(i == p2){
            p2 = p2*2;
            power++;
        }
        log2[i] = power-1;
    }
    int putere = 2;
    for(int i = 1; i<=log2[N]; i++){
    for(int j = 1; j<=N-putere+1; j++){
        if(v[rmq[i-1][j]] < v[rmq[i-1][j+putere/2]])
            rmq[i][j] = rmq[i-1][j];
        else
            rmq[i][j] = rmq[i-1][j+putere/2];
    }
    putere = putere *2;
    }
    for(int i = 1; i<=M; i++){
        int left, right, mid;
        fin>>left>>right;
        mid = log2[(right-left+1)];
        if(v[rmq[mid][left]] < v[rmq[mid][right-(1<<mid)+1]])
            fout<<v[rmq[left][left]]<<"\n";
        else
            fout<<v[rmq[mid][right-(1<<mid)+1]]<<"\n";
    }
}