Cod sursa(job #2874862)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 20 martie 2022 13:27:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>

using namespace std;

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

int lp[100001][20];
int a[100001];

void preprocces (int n)
{
    for (int i=1; i<=n; i++)
        lp[i][0] = i;

    for (int j=1; (1<<j) <= n; j++)
    {
        for (int i=1; (i+(1<<j) -1) <= n; i++)
        {
            if (a[lp[i][j-1]] < a[lp[i+(1<<(j-1))][j-1]])
                lp[i][j] = lp[i][j-1];
            else
                lp[i][j] = lp[i+(1<<(j-1))][j-1];
        }
    }
}

int query (int l, int r)
{
    int j = int(log2(r-l+1));
    return min(a[lp[l][j]], a[lp [r-(1<<j)+1][j]] );
}

int main()
{
    int n;
    in >> n;
    int q;
    in >> q;
    for (int i=1; i<=n; i++)
        in >> a[i];

    preprocces(n);

    while (q--)
    {
        int l, r;
        in >> l >> r;
        out << query(l, r) << '\n';
    }
    return 0;
}