Pagini recente » Cod sursa (job #919242) | Cod sursa (job #959057) | Cod sursa (job #3154389) | Cod sursa (job #2615020) | Cod sursa (job #3140479)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int NMAX = 100000,LOGMAX = 17;
int N, v[NMAX], LOG[NMAX+1], mini[NMAX][LOGMAX], Q;
void citire()
{
cin >> N >> Q;
for (int i = 1; i <= N; i++)
{
cin >> v[i];
}
}
void precalcLOG()
{
LOG[1] = 0;
for (int i = 2; i <= NMAX; i++)
{
LOG[i] = LOG[i / 2] + 1;
}
}
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;
}