Pagini recente » Cod sursa (job #652836) | Cod sursa (job #1388600) | Cod sursa (job #2400678) | Cod sursa (job #2725271) | Cod sursa (job #3140476)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int NMAX = 100001,LOGMAX = 17;
int N, v[NMAX], LOG[NMAX], mini[NMAX][LOGMAX], Q;
void citire()
{
cin >> N >> Q;
for (int i = 1; i <= N; i++)
{
cin >> v[i];
}
}
void precalcLOG()
{
int p = 1;
for (int i = 1; i <= NMAX; i++)
{
if (p <= i)
{
LOG[i] = p;
}
else
{
p *= 2;
LOG[i] = p;
}
}
}
void rmq()
{
//minimul pt un interval de lungime din i 2^0 este numarul in sine
for (int i = 1; i <= N; i++)
{
mini[i][0] = v[i];
}
//minimul pt un interval de lungime 2^k din i este minimul dintre minimul unui interval de lungime 2^(k-1) din i si minimul unui interval de lungime 2^(k-1) din i + 2^k - 1
for (int k = 1; k < LOGMAX; k++)
{
for (int i = 1; i + (1 << k) - 1 <= N; i++)
{
mini[i][k] = min(mini[i][k - 1], mini[i + (1 << k) - 1][k - 1]);
}
}
}
void queries()
{
for (int i = 1; i <= Q; i++)
{
int st, dr;
cin >> st >> dr;
int l = dr - st + 1;
int rez = min(mini[st][LOG[l]], mini[dr - (1 << LOG[l]) + 1][LOG[l]]);
cout << rez << '\n';
}
}
int main()
{
citire();
precalcLOG();
rmq();
queries();
return 0;
}