Cod sursa(job #2738851)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 6 aprilie 2021 14:20:14
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, t;
int v[100100][22];
int logaritm[100100];

void precalc()
{
    logaritm[1] = 0;
    for(int i = 2; i <= 100050; i ++)
    {
        logaritm[i] = logaritm[i / 2] + 1;
    }
    for(int i = 1; i <= 20; i ++)
    {
        int p2 = 1 << i;
        for(int j = 1; j + p2 - 1 <= n; j ++)
        {
            v[j][i] = min(v[j][i-1], v[j + p2 / 2][i-1]);
        }
    }
}

int rmq(int l, int r)
{
    int lg = r - l + 1;
    int logg = logaritm[lg];
    return min(v[l][logg], v[r - (1<<logg) + 1][logg]);
}

int main()
{
    ios_base::sync_with_stdio(0);
    fin.tie(0);
    fout.tie(0);
    fin >> n >> t;
    for(int i = 1; i <= n; i ++)
    {
        fin >> v[i][0];
    }
    precalc();
    while(t--)
    {
        int l, r;
        fin >> l >> r;
        fout << rmq(l,r) << '\n';
    }
    return 0;
}