Pagini recente » Cod sursa (job #2844927) | Cod sursa (job #3272357) | Cod sursa (job #1839775) | Cod sursa (job #2462297) | Cod sursa (job #3140483)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int NMAX = 100000,LOGMAX = 18;
int N, v[NMAX+1], LOG[NMAX+1], mini[NMAX+1][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;
}