Cod sursa(job #428905)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 29 martie 2010 17:43:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
FILE *f,*g;
long i,n,m,x,y,op,arb[200500];
long maxim(long a,long b)
{ if(a>b) return a; return b; }
void update(long k,long st,long dr,long poz,long val)
{ if(st==dr&&dr==poz) arb[k]=val;
  else 
   { long mij=(st+dr)/2;
     if(poz<=mij) { update(2*k,st,mij,poz,val); arb[k]=maxim(arb[2*k],arb[2*k+1]); }
	 else { update(2*k+1,mij+1,dr,poz,val); arb[k]=maxim(arb[2*k],arb[2*k+1]); }
   }
}
long querry(long k,long st,long dr,long x,long y)
{ if(x<=st&&dr<=y) return arb[k];
  else
   { long mij=(st+dr)/2; long fs,fd;
     if(x<=mij) fs=querry(2*k,st,mij,x,y); else fs=0;
	 if(y>=mij+1) fd=querry(2*k+1,mij+1,dr,x,y); else fd=0;
	 return maxim(fs,fd);
   }
}
int main()
{ f=fopen("arbint.in","r"); g=fopen("arbint.out","w");
  fscanf(f,"%ld%ld",&n,&m); 
  for(i=1;i<=n;i++) { fscanf(f,"%ld",&x); update(1,1,n,i,x); }
  for(i=1;i<=m;i++) 
   { fscanf(f,"%ld%ld%ld",&op,&x,&y);
     if(op==0) fprintf(g,"%ld\n",querry(1,1,n,x,y));
	 else update(1,1,n,x,y);
   }
  fclose(g);
  return 0;
}