Cod sursa(job #783025)

Utilizator AndupkIonescu Alexandru Andupk Data 1 septembrie 2012 23:16:27
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int ai[500000],val,pos,sol;

int right_son(int nod)
{ return nod*2+1; }

int left_son(int nod)
{ return nod*2; }

void update(int nod,int st,int dr)
 {
    if(st==dr)
	 {
		ai[nod]=val;
	    return;
	 }
	int mij=(st+dr)/2;
	  if(pos<=mij)
		update(left_son(nod),st,mij);
           else update(right_son(nod),mij+1,dr);	   
	 
     ai[nod]=max(ai[left_son(nod)],ai[right_son(nod)]);	 
 }
void search(int nod,int st,int dr,int a,int b)
{
 if(a<=st && dr<=b)
   {
     if(sol<ai[nod]) sol=ai[nod];
     return;
   }
   int mij=(st+dr)/2;
    if(a<=mij)  search(left_son(nod),st,mij,a,b);
	if(b>mij)   search(right_son(nod),mij+1,dr,a,b);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,i,m,a,b,x;
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
{
 scanf("%d",&x);
 val=x;
 pos=i;
 update(1,1,n);
}
while(m)
{
 scanf("%d %d %d\n",&x,&a,&b);
  if(x==0)
 {
  sol=0;	
  search(1,1,n,a,b);
  printf("%d\n",sol);
 }
 if(x==1)
   {
   pos=a;
   val=b;
   update(1,1,n);
   }
m--;
}
return 0;	
}