Cod sursa(job #2792446)

Utilizator mihai_popaPopa Mihai-Razvan mihai_popa Data 1 noiembrie 2021 18:05:06
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

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

const int NMAX = 1e5 + 3;

int n, q;
int lg[NMAX], rmq[20][NMAX];

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

int mymin(int a, int b)
{
    return (a < b ? a : b);
}

void build_rmq()
{
    int d;
    for(int l = 1; l <= lg[n]; l++)
    {
        d = (1 << (l - 1));
        for(int i = 1; i + d <= n; i++)
            rmq[l][i] = mymin(rmq[l - 1][i], rmq[l - 1][i + d]);
    }
}

int query(int x, int y)
{
    int sz = (y - x + 1);
    int L = lg[sz];

    return mymin(rmq[L][x], rmq[L][y - (1 << L) + 1]);
}

int main()
{
    fin >> n >> q;
    for(int i = 1; i <= n; i++)
        fin >> rmq[0][i];
    build_lg();
    build_rmq();

    int a, b;
    for(int i = 1; i <= q; i ++)
        fin >> a >> b, fout << query(a, b) << '\n';
    return 0;
}