Cod sursa(job #1751612)

Utilizator dodecagondode cagon dodecagon Data 1 septembrie 2016 17:27:20
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#define max(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;
		int kl=2*v;
	
		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)/2;
  int kl=2*v;
  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 index,int value,int st,int dr)
{
	if (st==dr)
		 t[v]=value; else 
		{
			int tmp=(st+dr)/2;
			int kl=2*v;
			if (index<=tmp)
				up(kl+1,index,value,st,tmp); 
			 else up(kl+2,index,value,tmp+1,dr);
			 t[v]=max(t[kl+1],t[kl+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-1,z-1));
     	 	else  
     	 		up(0,y-1,z,0,n-1);
     }


   fclose(in);
   fclose(out);

	return 0;
}