Pagini recente » Cod sursa (job #2175651) | Cod sursa (job #2431501) | Cod sursa (job #1978720) | Cod sursa (job #672850) | Cod sursa (job #2754279)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, q;
// log2 100000 e 16,ceva deci ajung 17 nivele
int rmq[100003][17];
void citire()
{
int i;
fin >> n >> q;
for(i = 1; i <= n; i++)
fin >> rmq[i][0];
}
void matrice()
{
/// rmq[i][j] = minimul din secventa din vectorul initial
/// care incepe la i si are lungime 2^j
int i, j;
for(j = 1; (1 << j) <= n; j++) // fiecare putere a lui doi luata pe rand
for(i = 0; i <= n - (1 << j) + 1; i++) // fiecare inceput al intervalelor luat pe rand
rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}
int logaritm2(int x)
{
int i;
for(i = 0; 1 << i <= x; i++) ;
return (i - 1);
}
void rezolvare()
{
int i, x, y, k, lungime, sol;
for(i = 1; i <= q; i++)
{
fin >> x >> y;
// k = log din lungimea intervalului
lungime = y - x + 1;
k = logaritm2(lungime);
sol = min(rmq[x][k], rmq[y - (1 << k) + 1][k]);
fout << sol << "\n";
}
}
int main()
{
citire();
matrice();
rezolvare();
fin.close();
fout.close();
return 0;
}