Cod sursa(job #2785520)

Utilizator bubblegumixUdrea Robert bubblegumix Data 18 octombrie 2021 20:25:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<vector>
#include<stack>
#include<queue>
#define all(v) v.begin(),v.end()
#define sorti(v) sort(all(v))
#define desc(x) greater<x>()
#define sortd(v) sort(all(v),desc(decltype(v[0])))
#define hmap unordered_map 
#define pow2(x) (1<<(x))
#define hset unordered_set
#define pq priority_queue
#define inf 0x3f3f3f3f
#define exists(x,v) (v.find(x)!=v.end())
#define inrange(x,a,b) (x>=a && x<=b)
#define printv(v) {for(auto it:v) cout<<it<<' ';cout<<'\n';}
#define printa(v,a,b) {for(int i=a;i<=b;i++ ) cout<<v[i]<<' ';cout<<'\n';}
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<long, long> pll;
const int lim = 1e5 + 5;
int lg2[lim];
int rmq[20][lim];
int n,m;
int a[lim];

int main()
{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> n>>m;
	for (int i = 2; i <= n; i++)
		lg2[i] = lg2[i / 2] + 1;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		rmq[0][i] = a[i];
	}
	for (int lg = 1; pow2(lg) <= n; lg++)
		for (int i = 1; i + pow2(lg) - 1 <= n; i++)
			rmq[lg][i] = min(rmq[lg - 1][i], rmq[lg - 1][i + pow2(lg - 1)]);
		
	for (int i = 1; i <= m; i++)
	{
		int l, r;
		cin >> l >> r;
		int p2 = lg2[r - l + 1];
		cout << min(rmq[p2][l], rmq[p2][r - (1 << p2) + 1])<<'\n';
	}
	
}