Cod sursa(job #204076)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 21 august 2008 17:16:35
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#define N 100001
#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(left(i)<2*n&&sir[left(i)].max>max)
  {max=sir[left(i)].max;}
  if(right(i)<2*n&&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(left(nod)<2*n)
  {creeaza(left(nod),st,(dr+st)/2);
  }
  if(right(nod)<2*n)
  {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(left(nod)<2*n && st<=sir[left(nod)].dr)
  {if(m<(t=max(left(nod),st,dr)))
   {m=t;
   }
  }
  if(right(nod)<2*n && dr>=sir[right(nod)].st)
  {if(m<(t=max(right(nod),st,dr)))
   {m=t;
   }
  }
  return m;
 }
}

int main ()
{long i,m,flag,a,b,c;
 FILE *fin=fopen ("arbint.in","r");
 FILE *fout=fopen("arbint.out","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
  }
 }
 fclose(fout);
 return 0;
}