Cod sursa(job #1521655)

Utilizator afkidStancioiu Nicu Razvan afkid Data 10 noiembrie 2015 18:57:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define N (1<<18)

using namespace std;
inline int MAX(int a,int b){return (a>b)?a:b;}
int tab[N+1]={0};
int n,q,a,b,t;

int query(int node,int a,int b,int x,int y)
{
	if(a>=x && y>=b)
	{
		return tab[node];
	}
	int ret1=0,ret2=0;
	int middle=(a+b)/2;
	if(x<=middle)
		ret1=query(node*2,a,middle,x,y);
	if(y>middle)
		ret2=query(node*2+1,middle+1,b,x,y);
	return MAX(ret1,ret2);
}

void update(int node,int a,int b,int i,int val)
{
	if(a==b && b==i)
	{
		tab[node]=val;
		return;
	}
	int middle=(a+b)/2;
	if(i<=middle)
		update(2*node,a,middle,i,val);
	else
		update(2*node+1,middle+1,b,i,val);
	tab[node]=MAX(tab[2*node],tab[2*node+1]);
}


int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	cin>>n>>q;
	for(int i=1;i<=n;++i)
	{
		cin>>a;
		update(1,1,n,i,a);
	}
	for(int i=0;i<q;++i)
	{
		cin>>t>>a>>b;
		if(t)
			update(1,1,n,a,b);
		else
		{
			int ans=query(1,1,n,a,b);
			cout<<ans<<"\n";
		}
	}
	return 0;
}