Pagini recente » Cod sursa (job #1397136) | Cod sursa (job #2063010) | Cod sursa (job #1633651) | Cod sursa (job #2735536) | Cod sursa (job #1673359)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int dmax = 100001;
const int Log = 18;
int v[dmax];
int lg[dmax];
int rmq[Log][dmax]; /* rmq[i][j] == MINIMUL DINTR-UN INTERVAL DE LUNGIME 2 ^ i CARE SE TERMINA PE POZITIA j */
int N, Q;
int minim(int x, int y)
{
if(x < y) return x;
else
return y;
}
void read()
{
in >> N >> Q;
for(int i = 1; i <= N; i++) in >> v[i];
}
void RMQ()
{
int i, j;
lg[1] = 0;
for(i = 2; i <= N; i++) lg[i] = lg[i/2] + 1;
for(j = 1; j <= N; j++) rmq[0][j] = v[j];
for(i = 1; (1 << i) <= N; i++)
for(j = 1; j <= N; j++)
rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);
}
void query()
{
int i, a, b, ans;
for(i = 1; i <= Q; i++)
{
in >> a >> b;
int l = lg[b - a + 1];
ans = minim(rmq[l][b], rmq[l][a + (1 << l) - 1]);
out << ans << '\n';
}
}
int main()
{
read();
RMQ();
query();
return 0;
}