Cod sursa(job #266664)

Utilizator petrecgClinciu Glisca Petre petrecg Data 25 februarie 2009 22:23:00
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
long i,m,n,x,a,b,arbInt[450000],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;
}