Cod sursa(job #2835652)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 19 ianuarie 2022 01:21:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

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

const int LMAX = 1e5 + 7;

int rmq[20][LMAX];
int power[LMAX];
int n, m;


void calcularePutere()
{
    power[1] = 0;
    for (int i = 2; i <= n; i++)
        power[i] = power[i / 2] + 1;
}

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

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

    for (int p = 1; (1 << p) <= n; p++)
        for (int i = 1; i <= n; i++)
        {
            int j = i + (1 << (p - 1));

            if (j <= n && rmq[p - 1][i] > rmq[p - 1][j])
                rmq[p][i] = rmq[p - 1][j];
            else
                rmq[p][i] = rmq[p - 1][i];
        }

    calcularePutere();

    for(int q = 1; q <= m; q++)
    {
        int left, right;

        fin >> left >> right;

        int putere = power[right - left + 1];

        int length = 1 << putere;

        fout << min(rmq[putere][left], rmq[putere][right - length + 1]) << "\n";
    }

    return 0;
}