Cod sursa(job #751114)

Utilizator RynaquiAxinte Silviu Rynaqui Data 24 mai 2012 15:20:50
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
int n,q,i,p,A,B,C,v[1<<18],getmax(int,int,int);
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	cin>>n>>q;
	for(p=1;;p*=2)if(p>=n)break;
	for(i=1;i<=n;i++)scanf("%d",&v[p+i-1]);
	for(i=p-1;i>=1;i--)v[i]=max(v[2*i],v[2*i+1]);
	for(;q;q--)
	{
		cin>>C>>A>>B;
		if(C==0)
			{
				cout<<getmax(1,1,p)<<"\n";
				//fprintf(stderr,"%d\n",getmax(1,1,p));
		}
		else
		{
			A+=p-1;v[A]=B;
			for(A/=2;A>=1;A/=2)
				v[A]=max(v[2*A],v[2*A+1]);
		}
	}
	return 0;
}
int getmax(int N,int S,int D)
{
	if(D<A||S>B)return 0;
	if(A<=S&&D<=B)return v[N];
	return max(getmax(2*N,S,(S+D)/2),getmax(2*N+1,(S+D)/2+1,D));
}