Pagini recente » Cod sursa (job #2152509) | Cod sursa (job #3219920) | Cod sursa (job #1383814) | Cod sursa (job #2393150) | Cod sursa (job #1903896)
#include <fstream>
#include <math.h>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstring>
#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[i] = lg[i >> 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[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + (1 << (i - 1))]);
}
else
{
RMQ[i][j] = RMQ[i - 1][j];
}
}
}
for (int i = 0; i <= lg[n];i++)
{
for (int j = 1; j <= n; j++)
cout << RMQ[i][j] << ' ';
cout << '\n';
}
}
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();
getchar();
return 0;
}