Cod sursa(job #2754279)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 25 mai 2021 16:14:24
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q;
// log2 100000 e 16,ceva deci ajung 17 nivele
int rmq[100003][17];

void citire()
{
    int i;
    fin >> n >> q;

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

void matrice()
{
    /// rmq[i][j] = minimul din secventa din vectorul initial
    /// care incepe la i si are lungime 2^j

    int i, j;

    for(j = 1; (1 << j) <= n; j++) // fiecare putere a lui doi luata pe rand
        for(i = 0; i <= n - (1 << j) + 1; i++) // fiecare inceput al intervalelor luat pe rand
            rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}

int logaritm2(int x)
{
    int i;
    for(i  = 0; 1 << i <= x; i++) ;
    return (i - 1);
}

void rezolvare()
{
    int i, x, y, k, lungime, sol;

    for(i = 1; i <= q; i++)
    {
        fin >> x >> y;
        // k = log din lungimea intervalului
        lungime = y - x + 1;
        k = logaritm2(lungime);
        sol = min(rmq[x][k], rmq[y - (1 << k) + 1][k]);

        fout << sol << "\n";
    }
}

int main()
{
    citire();
    matrice();
    rezolvare();

    fin.close();
    fout.close();
    return 0;
}