Cod sursa(job #1751621)

Utilizator dodecagondode cagon dodecagon Data 1 septembrie 2016 17:45:27
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#define max(a,b) ((a)>(b) ? (a):(b))


int a[100009],t[400009],n,m,i,x,y,z;

inline int next_int()
{
   char c=getchar();
   while (c>57 || c < 48) c=getchar();
   int k=0; 
   while (c<=57 && c>=48) 
   {
      k=k*10+c-48;
      c=getchar();
   }
 
   return k;
}

inline void build(int * a,int v,int st,int dr)
{
	if (st==dr) 
	  t[v]=a[st]; else 
	{
		int tmp=(st+dr)>>1;
		int kl=v<<1;
	
		build(a,kl+1,st,tmp);
		build(a,kl+2,tmp+1,dr);
		t[v]=max(t[kl+1],t[kl+2]);
	}
}

int q(int v,int st,int dr,int l,int r)
{
  if (st==l && dr==r)
  	return t[v];
  int tmp=(st+dr)>>1;
  int kl=v<<1;
  if (l>tmp)
  	 return q(kl+2,tmp+1,dr,l,r); else 
  	if (r<=tmp)
  		return q(kl+1,st,tmp,l,r); else 
  	 
  	 	return max(q(kl+1,st,tmp,l,tmp),q(kl+2,tmp+1,dr,tmp+1,r));
}

void up(int v,int st,int dr)
{
	if (st==dr)
		 t[v]=z; else 
		{
			int tmp=(st+dr)>>1;
			int kl=v<<1;
			if (y<=tmp)
				up(kl+1,st,tmp); 
			 else up(kl+2,tmp+1,dr);
			 t[v]=max(t[kl+1],t[kl+2]);
		}
}


int main()
{
   
   FILE * in=freopen("arbint.in","r",stdin);
   FILE * out=freopen("arbint.out","w",stdout);
     
     n=next_int();
     m=next_int();

     for (i=0;i<n;++i)
     	a[i]=next_int();
     	

     build(a,0,0,n-1);

     while (m--)
     {
     	x=next_int();
     	y=next_int()-1;
     	z=next_int();

     	 if (x==0)
              fprintf(out,"%d\n",q(0,0,n-1,y,z-1));
     	 	else  
     	 		up(0,0,n-1);
     }


   fclose(in);
   fclose(out);

	return 0;
}