Cod sursa(job #2348929)

Utilizator IOI_MDA_003Sebastian Chicu IOI_MDA_003 Data 20 februarie 2019 08:50:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 100000 + 5;

int dp[25][N_MAX], a[N_MAX], n, m;

void prep(){
    for(int i = 1; i <=n; ++i)
        dp[0][i] = i;

    for(int pow = 1; (1<<pow) <= n; ++pow)
        for(int i = 1; i <= n - (1<<pow) + 1; ++i)
            if(a[dp[pow-1][i]] > a[dp[pow-1][i + (1<<(pow-1))]])
                dp[pow][i] = dp[pow-1][i +(1<<(pow-1))];
            else
                dp[pow][i] = dp[pow-1][i];
}

int query(int lo, int hi){
    int pow = log2(hi-lo+1);
    if(a[dp[pow][lo]] < a[dp[pow][hi - (1<<pow) + 1]])
        return a[dp[pow][lo]];
    else
        return a[dp[pow][hi - (1<<pow) + 1]];
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <=n; ++i)
        fin >> a[i];

    prep();


    while(m--){
        int lo, hi;
        fin >> lo >> hi;

        fout << query(lo,hi) << "\n";
    }

    return 0;
}