Cod sursa(job #2868973)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 11 martie 2022 11:57:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define NMAX 100005
#define PMAX 20
int n, q, x, y, arr[NMAX], lookup[NMAX][PMAX];
void preprocess()
{
    for (int i=1;i<n;i++){
        lookup[i][0] = i;
    }
    for (int j=1;(1<<j)<=n;j++){
        for (int i=0;(i+(1<<j)-1)<n;i++){
            if (arr[lookup[i][j-1]] < arr[lookup[i+(1<<(j-1))][j-1]]){
                lookup[i][j] = lookup[i][j-1];
            }else{
                lookup[i][j] = lookup[i+(1<<(j-1))][j-1];
            }
        }
    }
}
int main() {
    fin >> n >> q;
    for (int i=0;i<n;i++){
        fin >> arr[i];
    }

    preprocess();
    for (int i=1;i<=q;i++){
        fin >> x >> y;
        x --;
        y --;
        int j = (int)log2(y - x + 1);
        if (arr[lookup[x][j]] <= arr[lookup[y-(1<<j)+1][j]]){
            fout << arr[lookup[x][j]] << '\n';
        }else{
            fout << arr[lookup[y-(1<<j)+1][j]] << '\n';
        }
    }
    return 0;
}