Cod sursa(job #540204)

Utilizator c_adelinaCristescu Adelina c_adelina Data 23 februarie 2011 19:52:11
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>

int v[100002],a[200002],n,q,w;

inline int max(int a, int b) { return (a > b ? a : b); }

int get(int poz,int l,int r,int x,int y)
{
	if ((l==x) && (r==y)) return a[poz];
	int mij=(l+r)/2;
	if (x>mij) return get(poz*2+1,mij+1,r,x,y); else
		if (y<=mij) return get(poz*2,l,mij,x,y); else
			return max(get(poz*2,l,mij,x,mij),get(poz*2+1,mij+1,r,mij+1,y));
}

void init(int poz,int l,int r)
{
	if (l==r) {a[poz]=v[l];return ;}
	int mij=(l+r)/2;
	init(poz*2,l,mij);
	init(poz*2+1,mij+1,r);
	a[poz]=max(a[poz*2],a[poz*2+1]);
}
	
void upd(int poz,int l,int r)
{
	if (l==r) {a[poz]=w; return ;}
	int mij=(l+r)/2;
	if (q<=mij) upd(poz*2,l,mij); else
		upd(poz*2+1,mij+1,r);
	a[poz]=max(a[poz*2],a[poz*2+1]);
}

int main()
{   int m,i,j,t,x,y,p;
	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]);
	init(1,1,n);
	while (m--)
	{
		scanf("%d %d %d",&t,&x,&y);
		if (t==1) 
			q=x,w=y,upd(1,1,n);
		 else
			printf("%d\n",get(1,1,n,x,y));
	}
return 0;
}