Pagini recente » Cod sursa (job #3315216) | Cod sursa (job #1034879) | Cod sursa (job #829672) | Cod sursa (job #827897) | Cod sursa (job #3326897)
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
int n, a[NMAX], m;
int rmq[NMAX][20];
int main()
{
int i, exp, power;
fin>>n>>m;
//citire si precalculare pt lungime 1
for(i = 1; i <= n; i++) {fin>>a[i]; rmq[i][0] = a[i];}
//rmq
for(power = 2, exp = 1; power <= n; power *= 2, exp++) //power = puterea efectiva; j = exponentul pentru care se atinge puterea
for(i = 1; i + power - 1 <= n; i++)
rmq[i][exp] = min(rmq[i][exp - 1], rmq[i + power / 2][exp - 1]);
//querry-urile
int l, r, lgsecv; //indicii care imi indica secventa a carui minim trebuie afisata
for(i = 1; i <= m; i++)
{
fin>>l>>r;
lgsecv = r - l + 1;
//calculeaza putere maxima care incape
power = 1; exp = 0;
while(power <= lgsecv) {power *= 2; exp++;}
power /= 2; exp--;
fout<<min(rmq[l][exp], rmq[r - power + 1][exp])<<'\n';
}
return 0;
}