Pagini recente » Cod sursa (job #540634) | Cod sursa (job #3145377) | Cod sursa (job #1879227) | Cod sursa (job #3139221) | Cod sursa (job #709345)
Cod sursa(job #709345)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define NMAX 100002
#define LMAX 18
long m, n;
long a[NMAX];
long rmq[LMAX][NMAX], lg[NMAX];
int main()
{
long int i, j, l;
fin >> n >> m;
for(i = 1; i <= n; ++i)
fin >> a[i];
//calculez puterile de 2..care e puterea maxima a lui 2 pana la i
//ex 7 = 2, 16=4, 3 = 1 s.a.m.d
lg[1] = 0;
for(i = 2; i <= n; ++i)
lg[i] = lg[i/2] + 1;
//initializam matricea..prima linie
for( i = 1; i <= n; ++i)
rmq[0][i] = a[i];
// a[i][j] reprezinta cel mai mic nr care incepe de la pozitia
// j si are lungimea 2^i
for( i = 1; (1 << i) <= n; ++i)
for( j = 1; j <= n - (1 << i)+1; ++j)
{
l = 1 << (i-1);
rmq[i][j] = min( rmq[i-1][j], rmq[i-1][j+l] );
}
long x, y, dif, sh;
for( i = 1; i <= m; ++i)
{
fin >> x >> y;
dif = (y-x)+1;
l = lg[dif];
sh = dif - (1 << l);
fout << min(rmq[l][x], rmq[l][x+sh]) << "\n";
}
/*
for(i = 0; i <= 5; ++i)
{
for( j = 0; j <= 5; ++j)
fout << rmq[i][j] << " ";
fout << endl;
}
*/
fin.close();
fout.close();
return 0;
}