Cod sursa(job #2788596)

Utilizator LukyenDracea Lucian Lukyen Data 26 octombrie 2021 00:39:11
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int i, j;
int nr_elem, nr_query, *vec, **tabel;

void gen_tabel();
int cautare_tabel(int a, int b);

int main()
{
    fin >> nr_elem;
    fin >> nr_query;
    vec = new int[nr_elem];
    tabel = new int *[nr_elem];
    for (i = 0; i < nr_elem; i++)
        tabel[i] = new int[(int)log2(nr_elem)];

    for (i = 0; i < nr_elem; i++)
        fin >> vec[i];

    gen_tabel();

    return 0;
}

void gen_tabel()
{
    // Coloana 0 tabel de chestionar
    for (i = 0; i < nr_elem; i++)
        tabel[i][0] = i;

    //Generare restul tabelului
    for (j = 1; pow(2, j) <= nr_elem; j++)
        for (i = 0; i + pow(2, j) - 1 < nr_elem; i++)
            tabel[i][j] = vec[tabel[i][j - 1]] < vec[tabel[i + (int)pow(2, j - 1)][j - 1]] ? tabel[i][j - 1] : tabel[i + (int)pow(2, j - 1)][j - 1];

    int st, dr, ind;
    for (i=1; i<=nr_query; i++)
    {
        fin >> st >> dr;
        ind = cautare_tabel(st-1, dr-1);
        fout << vec[ind] << "\n";
    }

return;
}

int cautare_tabel(int a, int b)
{
int lungime = b-a+1, dif;
j = log2(lungime);
dif = lungime - (int)pow(2, j);

return vec[tabel[a][j]] < vec[tabel[a+dif][j]] ? tabel[a][j] : tabel[a+dif][j];
}