Cod sursa(job #2707583)

Utilizator Uriesu_IuliusUriesu Iulius Uriesu_Iulius Data 17 februarie 2021 13:12:48
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q, lgn;
int v[100001], minq[100001][17];

void Citire()
{
    int i;
    fin >> n >> q;
    lgn = log2(n);
    for(i = 1; i <= n; i++)
        fin >> v[i];
}

void Preprocesare()
{
    int i, j, p2 = 2;
    for(i = 1; i <= n; i++)
        minq[i][0] = v[i];
    for(j = 1; j <= lgn; j++)
    {
        int lim = n - p2 + 1;
        for(i = 1; i <= lim; i++)
            minq[i][j] = min(minq[i][j - 1], minq[i + j][j - 1]);
        p2 *= 2;
    }
}

int putere(int a, int b)
{
    int p = 1;
    while(b)
    {
        if(b % 2 == 1)
            p *= a;
        a *= a;
        b /= 2;
    }
    return p;
}

int Rezolvare(int a, int b)
{
    int k = log2(b - a + 1), p2 = putere(2, k);
    return min(minq[a][k], minq[b - p2 + 1][k]);
}

int main()
{
    int a, b;
    Citire();
    Preprocesare();
    for(int i = 0; i < q; i++)
    {
        fin >> a >> b;
        fout << Rezolvare(a, b) << "\n";
    }
    return 0;
}