Pagini recente » Cod sursa (job #1184842) | bbbba | Cod sursa (job #561932) | Cod sursa (job #1838123) | Cod sursa (job #2790705)
#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];
}