Cod sursa(job #2360384)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 1 martie 2019 19:27:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, p, i, j, c, k;

int v[100005], l[100005], rmq[100005][20];

int main(){
    fin >> n >> m;
    for (i=1; i<=n; i++){
        fin >> v[i];
    }
    for (i=2; i<=n; i++){
        l[i] = l[i/2] + 1; //l[i] = parte intreaga din logaritm in baza 2 din i
    }
    for (i=1; i<=n; i++){ //initializez rmq pentru intervale de lungime 1
        rmq[i][0] = i;
    }
    //rmq[i][j] = indicele celei mai mici valori din intervalul care incepe pe pozitia i si are lungime 2^j
    for (j=1; (1<<j)<=n; j++){
        for (i=1; i+(1<<j)-1<=n; i++){
            if (v[rmq[i][j-1]] < v[rmq[i+(1<<(j-1))][j-1]]){
                rmq[i][j] = rmq[i][j-1];
            }
            else{
                rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
            }
        }
    }
    for (c=1; c<=m; c++){
        fin >> i >> j;
        k = l[j-i+1]; //impart segmentul dat in 2 bucati
        if (v[rmq[i][k]] <= v[rmq[j-(1<<k)+1][k]]){
            fout << v[rmq[i][k]] << "\n";
        }
        else{
            fout << v[rmq[j-(1<<k)+1][k]] << "\n";
        }
    }
}
//recapitulare