Cod sursa(job #220635)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 11 noiembrie 2008 21:06:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#include<string.h>
#define max(a,b)((a)>(b)?(a):(b))
FILE*fin=fopen("arbint.in","r");
FILE*fout=fopen("arbint.out","w");
int n,m,s[100000],t[300000];
int query(int nod,int st,int dr,int a,int b)
{
  int v1=0,v2=0;
  if(a<=st&&dr<=b) return t[nod];
  else
  {
    int mij=(st+dr)/2;
    if(a<=mij) v1=query(nod*2,st,mij,a,b);
    if(mij+1<=b) v2=query(nod*2+1,mij+1,dr,a,b);
    return max(v1,v2);
  }
}
void update(int nod,int st ,int dr,int a,int b)
{
   if(st<dr)
   {
     int mij=(st+dr)/2;
     if(a<=mij) update(nod*2,st,mij,a,b);
     else update(nod*2+1,mij+1,dr,a,b);
     t[nod]=max(t[nod*2],t[nod*2+1]);
   }
   else t[nod]=b;

}
int main()
{
  int i,o,a,b;
  fscanf(fin,"%d%d",&n,&m);
  for(i=1;i<=n;i++)
    fscanf(fin,"%d",&s[i]);
  memset(t,0,sizeof(t));
  for(i=1;i<=n;i++)
    update(1,1,n,i,s[i]);
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%d%d%d",&o,&a,&b);
    if(o) update(1,1,n,a,b);
    else fprintf(fout,"%d\n",query(1,1,n,a,b));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}