Cod sursa(job #2466965)

Utilizator educationalLets Go educational Data 3 octombrie 2019 13:38:16
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;

#define MaxN 100000

int arbint[4 * MaxN + 1];
int v[MaxN + 1];
int N, n, Q;

void Build()
{
	for(int i = N - 1; i >= 1; i--) arbint[i] = max(arbint[2 * i], arbint[2 * i + 1]);
}

void Update(int p, int x)
{
	p = N + p - 1;
	arbint[p]  = x;
	while(p > 1)
	{
		int tata = p / 2;
		arbint[tata] = max(arbint[2 * tata], arbint[2 * tata + 1]);
		p = p / 2;
	}
}

int Query(int node, int l, int r, int st, int dr)
{
	if(l == st && r == dr) return arbint[node];
	
	int m = (l + r) / 2;
	if(dr <= m) return Query(2 * node, l, m, st, dr);
	if(m <  st) return Query(2 * node + 1, m + 1, r, st, dr);
	return max(Query(2 * node, l, m, st, m), Query(2 * node + 1, m + 1, r, m + 1, dr));
}

int main(){
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	int i, op, a, b;
	
	cin >> n >> Q;
	for(N = 1; N < n; N = N * 2);
	for(i = 1; i <= n; i++)
	{
		cin >> v[i];
		arbint[N + i - 1] = v[i];
	}
	
	Build();
	while(Q--)
	{
		cin >> op >> a >> b;
		if(op == 0) { 
			cout << Query(1, 1, N, a, b) << '\n';	
		} else {
			Update(a, b);
		}
	}
	
	
	
return 0;
}