Cod sursa(job #2760213)

Utilizator danibaciuBaciu Daniel Mihai danibaciu Data 23 iunie 2021 21:11:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 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;
    int i, j, p2;
    for(i = 2; i <= 100050; i ++)
    {
        logaritm[i] = logaritm[i / 2] + 1;
    }
    for(i = 1; i <= 20; i ++)
    {
        p2 = 1 << i;//2 la i
        for (j = 1; j + p2 - 1 <= n; j ++)
        {
            v[j][i] = min(v[j][i-1], v[j + p2 / 2][i-1]);
        }
    }
}

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

int main()
{
    fin >> n >> t;
    int i, st, dr;
    for(i = 1; i <= n; i ++)
    {
        fin >> v[i][0];
    }
    precalc();
    while(t)
    {
        t--;
        fin >> st >> dr;
        fout << rmq(st,dr) << '\n';
    }
    return 0;
}