Cod sursa(job #204096)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 21 august 2008 18:58:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#define N 132000
#define left(x) 2*(x)
#define right(x) 2*(x)+1
#define pr(x) (x)/2
struct {long st,dr,max;}sir[2*N];
long p[N];
long n;

void modifica(long a,long b)
{long i=p[a],max;
 sir[i].max=b;
 
 for (i=pr(i);i;i=pr(i))
 {max=0;
  if(sir[i].st<sir[i].dr&&sir[left(i)].max>max)
  {max=sir[left(i)].max;}
  if(sir[i].st<sir[i].dr&&sir[right(i)].max>max)
  {max=sir[right(i)].max;}
  sir[i].max=max;
 }
}

void creeaza(long nod,long st,long dr)
{sir[nod].st=st;sir[nod].dr=dr;
 if(st==dr)
 {p[st]=nod;
 }
 else if(sir[nod].st<sir[nod].dr)
 {creeaza(left(nod),st,(dr+st)/2);
  creeaza(right(nod),(st+dr)/2+1,dr);
 }

}

long max(long nod, long st,long dr)
{if(st<=sir[nod].st&&sir[nod].dr<=dr)
 {return sir[nod].max;}
 else
 {long m=0,t;

  if(sir[nod].st<sir[nod].dr&&st<=sir[left(nod)].dr)
  {if(m<(t=max(left(nod),st,dr)))
   {m=t;
   }
  }
  if(sir[nod].st<sir[nod].dr&&dr>=sir[right(nod)].st)
  {if(m<(t=max(right(nod),st,dr)))
   {m=t;
   }
  }
  return m;
 }
}

int main ()
{long i,j,m,flag,a,b,c;
 FILE *fin=fopen ("arbint.in","r");
 FILE *fout=fopen("arbint.out","w");
 FILE *bug=fopen("debug.txt","w");
 fscanf(fin,"%ld%ld",&n,&m);
 creeaza(1,1,n);
 
 for (i=1;i<=n;i++)
 {fscanf(fin,"%ld",&c);
  modifica(i,c);
 }
 for (i=1;i<=m;i++)
 {fscanf(fin,"%ld%ld%ld",&flag,&a,&b);
  if(flag==0)
  {fprintf(fout,"%ld\n",max(1,a,b));
  }
  else
  {modifica(a,b);//el de pe pozitia a devine b
   /*for (j=1;j<2*n+10;j++)
   {fprintf(bug,"%ld %ld %ld  ",sir[j].st,sir[j].dr,sir[j].max);
   }
   fprintf(bug,"\n");*/
  }
 }
 fclose(fout);
 return 0;
}