Pagini recente » Cod sursa (job #978255) | Cod sursa (job #2336659) | Cod sursa (job #2043190) | Cod sursa (job #1498390) | Cod sursa (job #1587432)
#include <fstream>
#include <vector>
#include <cmath>
int main()
{
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
int n, q;
fin >> n >> q;
std::vector < int > values(n + 1);
for(int i = 0 ; i < n ; ++i)
fin >> values[i];
const int logn = __builtin_clz(n);
std::vector < std::vector < int > > table(n + 1, std::vector< int >(logn + 5));
for(int i = 0 ; i < n ; ++i)
table[i][0] = i;
for(int j = 1 ; (1 << j) <= n ; ++j)
{
for(int i = 0 ; i + (1 << (j - 1)) < n ; ++i)
if(values[table[i][j - 1]] <= values[table[i + (1 << (j - 1))][j - 1]])
table[i][j] = table[i][j - 1];
else
table[i][j] = table[i + (1 << (j - 1))][j - 1];
}
while(q--)
{
int s, e;
fin >> s >> e;
s--;
e--;
int k = e - s;
k = 31 - __builtin_clz(k + 1);
fout << std::min(values[table[s][k]], values[table[e - (1 << k ) + 1][k]]) << "\n";
}
return 0;
}