Cod sursa(job #2630050)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 23 iunie 2020 20:15:07
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int tree[4*100000+1], c[100001];

void build(int v, int tl, int tr)
{
	if(tl==tr)
	{
		tree[v]=c[tl];
		return;
	}
	int tm=(tl+tr)/2;
	build(2*v, tl, tm);
	build(2*v+1, tm+1, tr);
	tree[v]=max(tree[2*v], tree[2*v+1]);
}

void update(int v, int tl, int tr, int i, int x)
{
	if(i>tr || i<tl)
		return;
	if(tl==tr)
	{
		tree[v]=x;
		return;
	}

	int tm=(tl+tr)/2;
	update(2*v, tl, tm, i, x);
	update(2*v+1, tm+1, tr, i, x);
	tree[v]=max(tree[2*v], tree[2*v+1]);
}

int query(int v, int tl, int tr, int l, int r)
{
	if(tl>r || tr<l)
		return -1;
	if(l<=tl && tr<=r)
		return tree[v];
	int tm=(tl+tr)/2, x, y;
	x=query(2*v, tl, tm, l, r);
	y=query(2*v+1, tm+1, tr, l, r);
	return max(x, y);
}

int main()
{
	int N, M, p, a, b;
	fin>>N>>M;
	for(int i=1;i<=N;++i)
		fin>>c[i];
	build(1, 1, N);

	for(int i=0;i<M;++i)
	{
		fin>>p>>a>>b;
		if(p==0)
			fout<<query(1, 1, N, a, b)<<'\n';
		else
			update(1, 1, N, a, b);
	}
	return 0;
}