Cod sursa(job #3300768)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 18 iunie 2025 20:48:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
#define log ieurfherifhu

using namespace std;

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

const int DIM = 100001;

int log[DIM];

int rmq[int(log2(DIM)) + 1][DIM];

int n, q, v[DIM], i, j, st, dr;

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

    for(i = 1; i <= n; i++)

        fin >> v[i];

    for(i = 1; i <= n; i++)

        rmq[0][i] = v[i];

    for(i = 1; (1 << i) <= n; i++){

        for(j = 1; j <= n; j++){

            int k = (1 << (i - 1)) + j;

            rmq[i][j] = rmq[i-1][j];

            if(k <= n)

                rmq[i][j] = min(rmq[i][j], rmq[i - 1][k]);

        }

    }

    // log[i] = def = cea mai mare putere a lui 2 <= i

    for(i=2;i<=n;i++)

        log[i] = log[i / 2] + 1;

    while(q--){

        fin >> st >> dr;

        int len = log[dr - st + 1];

        fout<< min(rmq[len][st], rmq[len][dr - (1 << len) + 1]) << "\n";

    }


    return 0;
}