Cod sursa(job #2869699)

Utilizator vladsipunct5555Butnrau Vlad vladsipunct5555 Data 11 martie 2022 19:29:22
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
int v[100001];
int aib[4 * 100001];
void build (int nod, int st, int dr)
{
	if (st == dr)
	{
		aib[nod] = v[st];
		return;
	}
	int mid = st + (dr - st) / 2;
	build (nod<<1, st, mid);
	build (nod<<1|1, mid + 1, dr);
	aib[nod] = max(aib[nod<<1], aib[nod<<1|1]);
}
void update (int nod, int st, int dr, int poz, int val)
{
	if (st == dr && dr == poz)
	{
		aib[nod] = val;
		return;
	}
	
	if (dr < st)
		return;
	
	if (poz < st || poz > dr)
		return;
	
	int mid = st + (dr - st) / 2;
	update(nod<<1, st, mid, poz, val);
	update(nod<<1|1, mid + 1, dr, poz, val);
	aib[nod] = max(aib[nod<<1], aib[nod<<1|1]);
}
int qr (int nod, int st, int dr, int l, int r)
{
	if (l <= st && dr <= r)
		return aib[nod];
	
	if (dr < st)
		return -1;
	
	if (dr < l || st > r)
		return -1;
	int mid = st + (dr - st) / 2;
	int val1 = qr (nod<<1, st, mid, l, r);
	int val2 = qr (nod<<1|1, mid + 1, dr, l, r);
	return max(val1, val2);
}
int main ()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, q;
	cin >> n >> q;
	for (int i = 1;i<=n;++i)
		in >> v[i];
	build(1, 1, n);
	for (int i = 1;i<=q;++i)
	{
		int type;
		in >> type; 
		if (type == 0)
		{
			int a, b;
			in >> a >> b;
			out << qr(1, 1, n, a, b) << '\n';
		}
		else
		{
			int poz, val;
			in >> poz >> val;
			update(1, 1, n, poz, val);
		}
	}
	return 0;
}