Cod sursa(job #165752)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 26 martie 2008 19:07:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#define inf 0x3f3f3f3f
int A[100001],i,j,n,m,k,l,p,h[535001],max;
FILE *in,*out;

void actualizare(int nod,int st,int dr,int a,int b){
int mijl;
if(a<=st&&dr<=b)
 h[nod]=A[a];
else{
 mijl=(st+dr)/2;
  if(a<=mijl)
   actualizare(2*nod,st,mijl,a,b);
  if(b>mijl)
   actualizare(2*nod+1,mijl+1,dr,a,b);
  if(h[(p=nod)*2]<h[p*2+1])
   h[p]=h[p*2+1];
  else
   h[p]=h[p*2];
}
}

void interogare(int nod,int st,int dr,int a,int b){
int mijl;
if(a<=st&&b>=dr)
  if(max<h[nod])
   max=h[nod];
  else;
else{
 mijl=(st+dr)/2;
  if(a<=mijl)
   interogare(nod*2,st,mijl,a,b);
  if(b>mijl)
   interogare(nod*2+1,mijl+1,dr,a,b);
}
}

int main(){
in=fopen("arbint.in","rt");
out=fopen("arbint.out","wt");
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=n;i++)
 fscanf(in,"%d",&A[i]);
for(i=1;i<=n;i++)
 actualizare(1,1,n,i,i);
for(i=1;i<=m;i++){
 fscanf(in,"%d%d%d",&k,&l,&p);
  if(k){
   A[l]=p;
   actualizare(1,1,n,l,l);
  }
  else{
   max=0;
   interogare(1,1,n,l,p);
   fprintf(out,"%d\n",max);
  }
}
return 0;
}