Cod sursa(job #2622404)

Utilizator ddeliaioanaaDumitrescu Delia Ioana ddeliaioanaa Data 1 iunie 2020 11:06:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");

const int N = 100001;
int n, m, v[N], lg[N + 1], rmq[20][N + 1];


int main()
{
    int i, pas, a, b, lgdif;
    fin >> n >> m;
    for(i = 0; i < n; i++)
        fin >> v[i];

    for(i = 2; i <= n; i++)
        lg[i] = lg[i / 2] + 1;

    for(i = 0; i < n; i++)
        rmq[0][i] = v[i];    //minimul din urmatoarele 1 elem de pe poz i este evident i

     for (pas = 1;  (1 << pas) <= n; pas++) // 2 la pas <= n
        for (i = 0; i + (1 << pas) - 1 < n; i++) // ultimele sunt la fel ca mai sus
            rmq[pas][i] = std::min(rmq[pas - 1][i] , rmq[pas-1][ i + (1 << (pas - 1))]);

    for(i = 0; i < m; i++)
    {
        fin >> a >> b;
        lgdif = lg[b - a + 1];      //sa stim pe ce putere ne uitam in tabel
        fout << std::min(rmq[lgdif][a - 1], rmq[lgdif][b - (1 << lgdif)]) << '\n'; //suprapunem intervalele pt a avea 1 sg pas, nu log cum ar fi sa luam pe bucati ex pt 1-7: 1-4, 5-6, 7; luam direct min pe 1-4 si 4-7
    }




    return 0;
}