Pagini recente » Cod sursa (job #322238) | Cod sursa (job #2697098) | Cod sursa (job #562114) | Cod sursa (job #1305571) | Cod sursa (job #2336496)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, rmq[20][100005], lg[100005], q;
void Citire()
{
fin >> n >> q;
for(int i = 1; i <= n; i++)
fin >> rmq[0][i];
}
void Build()
{
lg[1] = 0;
for(int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
int L = lg[n];
for(int i = 1; i <= L; i++)
for(int j = 1; j + (1 << i) - 1 <= n ; j++)
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}
void Query()
{
int x, y;
for(int i = 1; i <= q; i++)
{
fin >> x >> y;
if(x > y) swap(x, y);
int L = lg[y - x + 1];
int bucata1 = rmq[L][x];
int bucata2 = rmq[L][y - (1 << L) + 1];
///se suprapun
/// x -> x + (1 << L) - 1;
/// y - (1 << L) + 1 -> y - (1 << L) + (1 << L) + 1 - 1
/// y
fout << min(bucata1, bucata2) << "\n";
}
}
int main()
{
Citire();
Build();
Query();
return 0;
}