Pagini recente » Cod sursa (job #3004510) | Cod sursa (job #1494237) | Cod sursa (job #389297) | Borderou de evaluare (job #3281569) | Cod sursa (job #455390)
Cod sursa(job #455390)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>
using namespace std;
#define FILE_IN "rmq.in"
#define FILE_OUT "rmq.out"
int N, M;
int V[24][100000];
static int min(int a, int b)
{
return (a<b) ? a : b;
}
void preprmq()
{
for (int k=1; k<24; k++)
{
int l = 1<<k;
int lp2 = 1<<(k-1);
for (int i=0; i<N-l; i++)
{
V[k][i] = min(V[k-1][i], V[k-1][i+lp2]);
}
}
}
int rmq(int a, int b)
{
a--;
b -= a;
int cr = V[0][a];
while (b>0)
{
int s = 31-__builtin_clz(b);
cr = min(cr, V[s][a]);
a += 1 << s;
b -= 1 << s;
}
return cr;
}
int main()
{
ifstream fisIn(FILE_IN);
ofstream fisOut(FILE_OUT);
fisIn >> N >> M;
for (int i=0; i<N; i++) fisIn >> V[0][i];
preprmq();
for (int i=0; i<M; i++)
{
int a,b;
fisIn >> a >> b;
fisOut << rmq(a,b) << '\n';
}
}