Cod sursa(job #2790705)

Utilizator AndreiP25Prusacov Andrei AndreiP25 Data 29 octombrie 2021 13:18:21
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 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[100000], tabel[100000][18];

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

int main()
{
    fin >> nr_elem;
    fin >> nr_query;

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

    gen_tabel();

    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 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; (1 << j) <= nr_elem; j++)
        for (i = 0; i + (1 << j) - 1 < nr_elem; i++)
            if(vec[tabel[i][j - 1]] < vec[tabel[i + (1 << j-1)][j - 1]])
                tabel[i][j] =  tabel[i][j - 1];
            else
                tabel[i][j] =tabel[i + (1 << j-1)][j - 1];

return;
}

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

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