Pagini recente » Cod sursa (job #2416643) | Cod sursa (job #2826485) | Cod sursa (job #1625555) | Cod sursa (job #3153650) | Cod sursa (job #2788596)
#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];
}