Cod sursa(job #2831546)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 11 ianuarie 2022 17:31:07
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5 + 5;
int rmq[NMAX][int(log2(NMAX)) + 2];
int n, m;

inline void citire()
{
    fin >> n >> m;

    int i;
    for(i = 1; i <= n; ++i)
        fin >> rmq[i][0];
}

inline void precalc_rmq()
{
    int i, j;
    for(j = 1; (1ll << j) <= n; ++j)
    {
        for(i = 1; i + (1ll << j) - 1 <= n; ++i)
            rmq[i][j] = min (rmq[i][j-1], rmq[i + (1ll << (j-1))][j-1]);
    }
}

inline int query_rmq(int st, int dr)
{
    int lmax = log2 (dr - st + 1), sol;
    sol = rmq[st][lmax];

    sol = min(sol, rmq[dr - (1ll << lmax) + 1][lmax]);
    return sol;
}

void answer_queries()
{
    int i, left, right;
    for(i = 1; i <= m; ++i)
    {
        fin >> left >> right;
        fout << query_rmq(left, right) << '\n';
    }
}
int main()
{
    citire();
    precalc_rmq();

//    for(int j = 0; (1ll << j) <= n; ++j)
//    {
//        fout << j << '\n';
//
//        for(int i = 1; i + (1ll << j) - 1<= n; ++i)
//            fout << rmq[i][j] << ' ';
//
//        fout << '\n';
//    }
//
//    for(int i = 1; i <= n; ++i)
//        fout << rmq[i][0] << ' ';

    answer_queries();

    return 0;
}