Cod sursa(job #298412)

Utilizator socheoSorodoc Ionut socheo Data 6 aprilie 2009 01:38:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
int n,m,a[610000],i,max;
int maxim(int x,int y)
{ if(x>y) return x;
  else return y;
}

void update(int nod,int left,int right,int poz,int val)
{if(left==right)
	a[nod]=val;
 else { int mij=(left+right)/2;
        if(poz<=mij)
			update(2*nod,left,mij,poz,val);
		if(poz>mij)
			update(2*nod+1,mij+1,right,poz,val);
      	a[nod]=maxim(a[2*nod],a[2*nod+1]);
      }

}

void query(int nod,int left,int right,int l,int r)
{ if(left>=l&&r>=right)
 {if(max<a[nod])
	 max=a[nod];
 }
 else
    {  int mij=(left+right)/2;
       if(mij>=l)
		   query(2*nod,left,mij,l,r);
	   if(mij<r)
		   query(2*nod+1,mij+1,right,l,r);
	}
	
}

int main()
{  freopen("arbint.in","r",stdin);
   freopen("arbint.out","w",stdout);
   scanf("%d%d",&n,&m);
   for(i=1;i<=n;i++)
	 { int t;
		 scanf("%d",&t);
	   update(1,1,n,i,t);
	 }
   for(i=1;i<=m;i++)
   { max=0;
	   int q,w,e;
	   scanf("%d%d%d",&q,&w,&e);
     if(q==0)
	   { query(1,1,n,w,e);
         printf("%d\n",max);
       }
     if(q==1)
        update(1,1,n,w,e);
   }	 
	
	return 0;}