Cod sursa(job #3301640)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 28 iunie 2025 17:30:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

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

pair <int,int> dp[22][100005];
int v[100005];
int lg[100005];

void PreCalc_Log(int n){
    lg[1] = 0;
    for (int i=2;i<=n;++i){
        lg[i] = lg[i/2]+1;
    }
}

int main()
{
    int n,m;
    fin >> n >> m;
    for (int i=1;i<=n;++i){
        fin >> v[i];
    }
    v[n+1] = 1e9;
    for (int i=1;i<=n;++i){
        dp[0][i] = min(make_pair(v[i],i),make_pair(v[i+1],i+1));
    }
    for (int i=1;i<20;++i){
        for (int j=1;j<=n;++j){
            if (j+(1<<i)>n) continue;
            dp[i][j] = min(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
        }
    }
    PreCalc_Log(n);
    for (int i=1;i<=m;++i){
        int L,R;
        fin >> L >> R;
        if (L==R){
            fout << v[L] << '\n'; // caz particular
            continue;
        }
        int p = lg[R-L];
        pair <int,int> ans = min(dp[p][L],dp[p][R-(1<<p)]);
        fout << ans.first << '\n';
    }
    return 0;
}