Cod sursa(job #2870391)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 12 martie 2022 12:11:26
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define FOR(i, st, dr) for(i = st; i <= dr; i++)
#define pii pair<int,int>
//#define fin cin
//#define fout cout

using namespace std;

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

const int NMAX = 1e5 + 5;

int n, q, w[NMAX];
int rmq[NMAX][22];

inline void computeRMQ()
{
    int i, j;

    for(i = 1; i <= n; ++i)
        rmq[i][0] = w[i];

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

inline int query(int a, int b)
{
    if(a > b)
        swap(a, b);

    int lung = log2(b - a + 1);

    return min(rmq[a][lung], rmq[b - (1 << lung) + 1][lung]);
}

int main()
{
    fin >> n >> q;

    int i;
    for(i = 1; i <= n; ++i)
        fin >> w[i];
    computeRMQ();
    for(i = 1; i <= q; ++i)
    {
        int a, b;
        fin >> a >> b;
        fout << query(a, b) << '\n';
    }

    return 0;
}