Cod sursa(job #266667)

Utilizator petrecgClinciu Glisca Petre petrecg Data 25 februarie 2009 22:26:26
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
long i,m,n,x,a,b,arbInt[410000],maxx;
long max(long x,long y)
{if(x<y)return y;else return x;}
void add(long nod, long stanga, long dreapta,long loc,long valoare)
{if (stanga == dreapta)
 {arbInt[nod] = valoare;return;}
 int median = (stanga + dreapta) / 2;
 if (loc <= median) add(nod * 2, stanga, median, loc, valoare);
	  else add(nod * 2 + 1, median + 1, dreapta, loc, valoare);
 arbInt[nod] = max(arbInt[nod * 2], arbInt[nod * 2 + 1]);
}

long query(long nod, long stanga, long dreapta, long st, long fn)
{ if(st<=stanga&&dreapta<=fn)
    return arbInt[nod];
  long median=(stanga+dreapta)/2;
  long minim=0;
  if(st<=median)
    minim=max(minim,query(2*nod,stanga,median,st,fn));
  if(median<fn)
    minim=max(minim,query(2*nod+1,median+1,dreapta,st,fn));

  return minim;
}
int main()
{freopen("arbint.in","r",stdin);freopen("arbint.out","w",stdout);
 fscanf(stdin,"%ld%ld",&n,&m);
 for(i=1;i<=n;++i){fscanf(stdin,"%ld",&x);add(1,1,n,i,x);}
 for(i=1;i<=m;++i)
  {fscanf(stdin,"%ld%ld%ld",&x,&a,&b);
   if(x)add(1,1,n,a,b);
    else {maxx=query(1,1,n,a,b);fprintf(stdout,"%ld\n",maxx);}
  }
 fclose(stdin);fclose(stdout);
 return 0;
}