Cod sursa(job #2964938)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 14 ianuarie 2023 10:28:38
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pi = pair<int, int>;
using ti = tuple<int, int, int>;
using tl = tuple<ll, ll, ll>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
using pl = pair<ll, ll>;
using vi = vector<int>;
using vl = vector<ll>;
using vpi = vector<pi>;
using vpil = vector<pil>;
using vpli = vector<pli>;
using vpl = vector<pl>;
using vti = vector<ti>;
using vtl = vector<tl>;
using vvi = vector<vi>;
using vvl = vector<vl>;
using vvpi = vector<vpi>;
using vvpil = vector<vpil>;
using vvpli = vector<vpli>;
using vvpl = vector<vpl>;
using vvti = vector<vti>;
using vvtl = vector<vtl>;


#if 1
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define cin fin
#define cout fout
#endif

const int nmx = 1e5 + 1;
vvi rq;
int n, q;
int a[nmx];
int lg[nmx];
void prec()
{
	for (int i = 1; i < 20; i++)
		for (int j = 0; j + (1 << i) <= n; j++)
		{
			rq[i][j] = min(rq[i - 1][j],rq[i-1][j+(1<<(i-1))]);
		}
}

int rmq(int st, int dr)
{
	int l = lg[dr - st + 1];
	return min(rq[l][st], rq[l][dr - (1<<l) + 1]);
}
/*
0 1 2 3 4 5 6
  1   3
*/
int main()
{
	cin >> n >> q;
	rq = vvi(20, vi(n));
	for (int i = 2; i <= n; i++)
		lg[i] = lg[i / 2] + 1;
	for (int i = 0; i < n; i++)
		cin >> a[i], rq[0][i] = a[i];
	
	prec();
	while (q--)
	{
		int st, dr;
		cin >> st >> dr;
		st--, dr--;
		cout << rmq(st, dr) << "\n";
	}
}