Cod sursa(job #2260400)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 14 octombrie 2018 22:11:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <cmath>
#include <fstream>

const int MAXN = 1e5 + 5,MAX_LOG = 40;

using namespace std;

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

int dp[MAX_LOG][MAXN],v[MAXN],log_precalc[MAXN],n,q;
//dp[i][j] = min pe v[j, j + 2 ^ i]
///i = 0 => min pe v[j, j + 1]
int put;

int main()
{
    in>>n>>q;
    for(int i = 1; i <= n; i++){
        in>>v[i];
        dp[0][i] = v[i];
    }
    for(int i = 2; i <= n; i++)
        log_precalc[i] = log_precalc[i>>1] + 1;
    put = log_precalc[n] + 1;

    for(int i = 1; i <= put; i++){
        for(int j = 1; j <= n; j++){
            /// [j,j + 2 ^ i] = [j, j + 2 ^ (i - 1)] U [j + 2 ^ (i - 1), j]
            /// dp[i][j] = dp[i - 1][j] , dp[i - 1][j + 2 ^ (i - 1)]
            dp[i][j] = min(dp[i - 1][j],dp[i - 1][j + (1<<(i - 1))]);
        }
    }
    for(int test = 1; test <= q; test++){
        int i,j;
        in>>i>>j;
        int lung = j - i + 1,log = log_precalc[lung];
        /// [i,j] = [i, i + 2 ^ log] U [j - 2 ^ log,j]
        /// min[i,j] = dp[log][i] , dp[log][j - 2 ^ log]
        out<<min(dp[log][i],dp[log][j - (1<<log) + 1])<<"\n";

    }
    return 0;
}