Pagini recente » Istoria paginii runda/barosanii | Cod sursa (job #439677) | Cod sursa (job #2505444) | Cod sursa (job #1850727) | Cod sursa (job #968300)
Cod sursa(job #968300)
#include <iostream>
#include <fstream>
using namespace std;
int n, m;
int a[100010];
int lg[100010]; /// lg[i] = partea intreaga a log in baza 2 de i
int rmq[17][100010];/// rmq[i][j] = minimul dintr-o secventa care incepe la pozitia j si are lungime 2^i
inline void Compute()
{
int i, j, lim;
for (i=2; i<=n; i++)
lg[i] = lg[i>>1] + 1;
///
for (i=1; i<=n; i++)
rmq[0][i] = a[i]; /// initializare
for (i=1; (1<<i) <= n; i++)
{
lim = n - (1<<i) + 1;
for (j=1; j<=lim; j++)
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
/// impart secventa de lungime 2^i in 2 secvente de lungime 2^(i-1) si aleg minimul dintre cele 2
}
}
int main()
{
ifstream f ("rmq.in");
ofstream g ("rmq.out");
f>>n>>m;
int i, x, y, dif, L, lungime;
for (i=1; i<=n; i++)
f>>a[i];
Compute();
while (m--)
{
f>>x>>y;
dif = y - x + 1;
L = lg[dif];
lungime = (1<<L);
g<<min(rmq[L][x], rmq[L][x+dif-lungime])<<"\n";
}
f.close();
g.close();
return 0;
}