Cod sursa(job #256447)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 11 februarie 2009 19:13:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h> 

#define IN "arbint.in"
#define OUT "arbint.out"
#define DIM 500001

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

int n,m;
int arb[DIM];
int start,finish,val,pos,maximul;

inline int maxim(int,int);
void update(int,int,int);
void query(int,int,int);

int main()
{
 int x,a,b;
 int i;
    
 fscanf(fin,"%d%d",&n,&m);

 for(i=1;i<=n;i++)
 {
  fscanf(fin,"%d",&x);

  pos=i;
  val=x;

  update(1,1,n);
 }

 for(i=1;i<=m;i++)
 {
  fscanf(fin,"%d%d%d",&x,&a,&b);
  
  if(x==0) 
  {
   maximul=-1;
   start=a;
   finish=b;
   query(1,1,n);
             
   fprintf(fout,"%d\n",maximul);
  }
  else
  {
   pos=a;
   val=b;
   update(1,1,n);
  }
 }
 
 fclose(fin);
 fclose(fout);
 
return 0;
}

inline int maxim(int a, int b)
{
 if(a>b)
  return a;
 return b;
}

void update(int nod,int st,int dr)
{
 if(st==dr)
 {
  arb[nod]=val;
  return;
 }
     
 int med=(st+dr)/2;
 
 if(pos<=med)
  update(2*nod,st,med);
     else           
  update(2*nod+1,med+1,dr);
     
 arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
}

void query(int nod,int st,int dr)
{
 if(start<=st && dr<=finish)
 {
  if(maximul<arb[nod])
   maximul=arb[nod];
  return;
 }
     
 int med=(st+dr)/2;
 
 if(start<=med)
  query(2*nod,st,med);

 if(med<finish)
  query(2*nod+1,med+1,dr);
}