Pagini recente » Statistici Vlad Dumitrescu (therain3r) | Cod sursa (job #3041250) | Cod sursa (job #1990632) | Cod sursa (job #2927087) | Cod sursa (job #1903783)
#include <fstream>
#include <math.h>
#include <vector>
#include <algorithm>
#define N 100010
#define M 1000010
#define LOGN
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
vector<int> lg(N);
int n,m;
int RMQ[20][N];
void preprocess()
{
lg[1] = 0;
f >> RMQ[0][1];
for (int i = 2; i <= n; i++)
{
lg[n] = lg[n >> 1] + 1;
f >> RMQ[0][i];
}
for (int i = 1; i < lg[n];i++)
{
for (int j = 1; j <= n;j++)
{
if(j + (1<<i) <= n)
{
RMQ[j][i] = min(RMQ[j][i - 1], RMQ[j + (1 << (i - 1))][i - 1]);
}
else
{
RMQ[j][i] = RMQ[j][i - 1];
}
}
}
}
int querry(int li,int ls)
{
int dif = ls - li + 1;
if ((dif &(dif - 1)) == 0)
return RMQ[lg[dif]][li];
else
{
return min(
RMQ[lg[dif]][li],
RMQ[lg[dif]][li + (dif - (1 << lg[dif]))]
);
}
}
void prelucrare()
{
int li, ls;
f >> n >> m;
preprocess();
for (int i = 0; i < m;i++)
{
f >> li >> ls;
g << querry(li, ls) << '\n';
}
f.close();
g.close();
}
int main()
{
prelucrare();
}