Pagini recente » Istoria paginii runda/wellcodesimulareoni1 | Istoria paginii runda/nush_chare | warm-up-2020/solutii/cuantictiori | Problema satisfiabilităţii formulelor logice de ordinul doi | Cod sursa (job #2707589)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, q, lgn;
int v[100001], minq[100001][17];
void Citire()
{
int i;
fin >> n >> q;
lgn = log2(n);
for(i = 1; i <= n; i++)
fin >> v[i];
}
void Preprocesare()
{
int i, j, p2 = 2;
for(i = 1; i <= n; i++)
minq[i][0] = v[i];
for(j = 1; j <= lgn; j++)
{
int lim = n - p2 + 1;
for(i = 1; i <= lim; i++)
minq[i][j] = min(minq[i][j - 1], minq[i + p2 / 2][j - 1]);
p2 *= 2;
}
}
int putere(int a, int b)
{
int p = 1;
while(b)
{
if(b % 2 == 1)
p *= a;
a *= a;
b /= 2;
}
return p;
}
int Rezolvare(int a, int b)
{
int k = log2(b - a + 1), p2 = putere(2, k);
return min(minq[a][k], minq[b - p2 + 1][k]);
}
int main()
{
int a, b;
Citire();
Preprocesare();
for(int i = 0; i < q; i++)
{
fin >> a >> b;
fout << Rezolvare(a, b) << "\n";
}
return 0;
}