Pagini recente » Cod sursa (job #3333780) | Cod sursa (job #1670545) | Diferente pentru problema/coduri intre reviziile 13 si 12 | Borderou de evaluare (job #1774984) | Cod sursa (job #3348003)
#include <iostream>
#include <fstream>
#include <iomanip>
//#include <cmath>
using namespace std;
const int NMAX = 100001,
KMAX = 17; //~log2(NMAX)
int N,
T[KMAX][NMAX],
lg2[NMAX];
ifstream f("rmq.in");
ofstream g("rmq.out");
//
//void afisT()
//{
// for(int i = 0; (1 << i) <= N; i++)
// {
// for(int j = 1; j <= N; j++)
// cout << setw(3) << T[i][j];
// cout << '\n';
// }
//}
void buildSparseTable()
{
for(int i = 1; (1 << i) <= N; i++)
for(int j = 1; j + (1 << i) - 1 <= N; j++)
{
T[i][j] = min(T[i - 1][j], T[i - 1][j + (1 << (i - 1))]);
}
}
int query(int x, int y)
{
int k = lg2[y - x + 1];
//cout << x << ' ' << y << ": ";
//cout << T[k][x] << ' ' << T[k][y - (1 << k) + 1] << '\n';
return min(T[k][x], T[k][y - (1 << k) + 1]);
}
int main()
{
int M, x, y;
f >> N >> M;
lg2[0] = -1;
for(int i = 1; i <= N; i++)
{
f >> T[0][i];
lg2[i] = lg2[i >> 1] + 1;
}
lg2[0] = 0;
//
//
buildSparseTable();
//afisT();
//
while(M--)
{
f >> x >> y;
g << query(x, y) << '\n';
}
f.close();
g.close();
return 0;
}