Cod sursa(job #1751509)

Utilizator dodecagondode cagon dodecagon Data 1 septembrie 2016 15:11:54
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#define max(a,b) ((a)>(b) ? (a):(b))
#define min(a,b) ((a)<(b) ? (a):(b))


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

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

int q(int v,int st,int dr,int l,int r)
{
	if (l>r) return 0;

  if (st==l && dr==r)
  	return t[v];
  int tmp=(st+dr)/2;
  	 
  return max(q(2*v+1,st,tmp,l,min(r,tmp)),q(2*v+2,tmp+1,dr,max(l,tmp+1),r));
}

void up(int v,int index,int value,int st,int dr)
{
	if (st==dr)
		 t[v]=value; else 
		{
			int tmp=(st+dr)/2;
			if (index<=tmp)
				up(2*v+1,index,value,st,tmp); 
			 else up(2*v+2,index,value,tmp+1,dr);

			 t[v]=max(t[2*v+1],t[2*v+2]);
		}
}


int main()
{
   
   FILE * in=fopen("arbint.in","r");
   FILE * out=fopen("arbint.out","w");
     
     fscanf(in,"%d%d",&n,&m);
     for (i=0;i<n;++i)
     	fscanf(in,"%d",a+i);

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

     while (m--)
     {
     	fscanf(in,"%d%d%d",&x,&y,&z);
     	 if (x==0)
              fprintf(out,"%d\n",q(0,0,n-1,y,z));
     	 	else  
     	 		up(0,y,z,0,n-1);
     }


   fclose(in);
   fclose(out);

	return 0;
}