Pagini recente » Monitorul de evaluare | Cod sursa (job #203955) | Diferente pentru problema/seqval intre reviziile 7 si 6 | Cod sursa (job #2396902) | Cod sursa (job #3342007)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define cin fin
#define cout fout
int n,q,a[100001],rmq[20][100001];
int p2[20];
void precalc_puteri()
{
p2[0] = 1;
for (int i = 1; i <= 20; i++)
{
p2[i] = p2[i-1]*2;
}
}
void build_rmq()
{
int k;
for (int i = 1 ; i <= n; i++)
{
rmq[0][i] = a[i];
}
for(int i = 1 ; p2[i] <= n; i++)
{
for (int j = 1; j + p2[i] - 1 <= n; j++)
{
int lg = p2[i-1];
int st = rmq[i-1][j];
int dr = rmq[i-1][j+lg];
rmq[i][j] = min(st,dr);
}
}
}
int lg[1000001];
void build_log()
{
lg[1] = 0;
for (int i = 2; i <= n; i++)
{
lg[i] = lg[i/2] + 1;
}
}
int query(int i, int j)
{
int lungime = j-i+1;
int k = lg[lungime];
int st = rmq[k][i];
int dr = rmq[k][j-p2[k]+1];
return min(st,dr);
}
int main()
{
cin >> n >> q;
for (int i = 1 ; i <= n; i++)
{
cin >> a[i];
}
precalc_puteri();
build_rmq();
build_log();
for (int i = 1; i <= q; i++)
{
int x,y;
cin >> x >> y;
cout << query(x,y);
}
}