Cod sursa(job #2733959)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 31 martie 2021 10:09:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

const int INF = 0x3f3f3f3f3f3f3f3f;

int n, q;
int v[100100], rmq[100100][20], log[100100];

void precalc()
{
    for(int i = 1; i <= n; i++)
        rmq[i][0] = v[i];

    for(int j = 1; j <= log[n]; j++)
        for(int i = 1; i + (1 << j) - 1 <= n; i++)
            rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}

int query(int x, int y)
{
    int len = y - x + 1;

    return min(rmq[x][log[len]], rmq[y - (1 << log[len]) + 1][log[len]]);
}

int main()
{
    memset(rmq, INF, sizeof rmq);

    in >> n >> q;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    for(int i = 2; i <= n; i++)
        log[i] = log[i / 2] + 1;

    precalc();

    while(q--)
    {
        int x, y;
        in >> x >> y;

        if(y < x)
            swap(x, y);

        out << query(x, y) << '\n';
    }

    return 0;
}