Cod sursa(job #2818688)

Utilizator Stormtrooper-007Vartic Rihard Stormtrooper-007 Data 16 decembrie 2021 18:15:18
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;



struct STree {
	int n;
	vector<int> t;
	int Tree(vector<int>& A) {
		n = 1;
		while (n < A.size()) n *= 2;
		t.assign(n*2, 0);

		for (int i = n; i < n + A.size(); ++i) {
			t[i] = A[i - n];
		}
		for (int i = n - 1; i >= 1; --i) {
			t[i] = min(t[i * 2] , t[i * 2 + 1]);
		}
	}

	int Get(int l, int r) {
		l += n;
		r += n;
		int sum = 2e+9;
		for (l, r; l <= r; l /= 2, r /= 2) {
			if (l % 2 == 1) sum=min(t[l++],sum);
			if (r % 2 == 0) sum=min(t[r--],sum);
		}
		return sum;

	}

	void Set(int index, int v) {
		index += n;
		t[index] = v;
		index /= 2;

		while (index >= 1) {
			t[index] = min(t[index * 2],t[index * 2 + 1]);
			index /= 2;
		}
	}
};
int main()
{int n,q,l,r;
cin>>n>>q;
struct STree v;
vector<int>a(n);
for(int i=0;i<n;i++)
cin>>a[i];
v.Tree(a);
for(int i=1;i<=q;i++)
{
    cin>>l>>r;
    cout<<v.Get(l-1,r-1)<<'\n';
}
    return 0;
}