Cod sursa(job #761998)

Utilizator geniucosOncescu Costin geniucos Data 28 iunie 2012 11:50:03
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<cstdio>
using namespace std;
int m,n,i,op,a,b,xi,t[400002];
int max(int i,int j)
{
	if(i>j) return i;
	return j;
}
void update(int nod,int x,int y,int poz,int val)
{
	if(x==y)
	{
		t[nod]=val;
		return ;
	}
	int mij=(x+y)/2;
	if(poz<=mij)
		update(nod*2,x,mij,poz,val);
	else
		update(nod*2+1,mij+1,y,poz,val);
	t[nod]=max(t[nod*2],t[nod*2+1]);
}
int q(int nod,int st,int dr,int x,int y)
{
	if(x<=st&&dr<=y) return t[nod];
	int mij=(st+dr)/2;
	int sol=-1;
	if(x<=mij)
		sol=q(nod*2,st,mij,x,y);
	if(mij<y)
		sol=max(sol,q(nod*2+1,mij+1,dr,x,y));
	return sol;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
{
	scanf("%d",&xi);
	update(1,1,n,i,xi);
}
for(i=1;i<=m;i++)
{
	scanf("%d",&op);
	scanf("%d",&a);
	scanf("%d",&b);
	if(op==1) update(1,1,n,a,b);
	else printf("%d\n",q(1,1,n,a,b));
}
return 0;
}