Cod sursa(job #896764)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 27 februarie 2013 17:08:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
int m,n,i,j,v[100013],h[300013],c,x,y;
inline int max(int a, int b)
{
	return(a>b?a:b);
}
int constr(int i, int st, int dr)
{
	if(st==dr) {h[i]=v[st];return v[st]; }
	h[i]=max(constr(i*2,st,(st+dr)/2),constr(i*2+1,(st+dr)/2+1,dr));
	return h[i];
}
int gas(int i, int st, int dr, int x, int y)
{
	if(st==x && dr==y)return h[i];
	int m=(st+dr)/2;
	if(y<=m) return gas(i*2,st,m,x,y);
	if(x>=m+1) return gas(i*2+1,m+1,dr,x,y);
	return max(gas(i*2,st,m,x,m),gas(i*2+1,m+1,dr,m+1,y));
}
int upd(int i, int st, int dr, int x)
{
	if(st==x && dr==x){v[st]=h[i]=y;return y;}
	int m=(st+dr)/2;
	if(x<=m) h[i]=max(upd(i*2,st,m,x),h[i*2+1]);
	else h[i]=max(h[i*2],upd(i*2+1,m+1,dr,x));
	return h[i];
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)scanf("%d",&v[i]);
	h[1]=constr(1,1,n);
 	for(i=0;i<m;++i)
	{
		scanf("%d%d%d",&c,&x,&y);
		switch(c)
		{
		case 0:
			{
				printf("%d\n",gas(1,1,n,x,y));
				break;
			}
		case 1:
			{
				h[1]=upd(1,1,n,x);
				break;
			}
		}
	}
	return 0;
}