Cod sursa(job #352030)

Utilizator irene_mFMI Irina Iancu irene_m Data 30 septembrie 2009 09:49:37
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#define MaxN 100009
#define fs(x)     (2*(x))
#define fd(x)     (2*(x)+1)

int arb[MaxN],n,m,a,b,pos,val,op,max,i;

int maxim(int a,int b)
{
      if(a>b)
            return a;
      return b;
}

void update(int nod,int st,int dr)
{
      int div;
      if(st==dr)
      {
            arb[nod]=val;
            return;
      }
      div=(st+dr)/2;
      if(div>=pos)
            update(fs(nod),st,div);
      else
            update(fd(nod),div+1,dr);
      arb[nod]=maxim(arb[fs(nod)],arb[fd(nod)]);
}

void query(int nod,int st,int dr)
{
      if(st>=a && dr<=b)
      {
            if(max<arb[nod])
                  max=arb[nod];
            return;
      }

      int div=(st+dr)/2;
      if(a<=div)
            query(fs(nod),st,div);
      if(div<b)
            query(fd(nod),div+1,dr);
}

int main()
{
      freopen("arbint.in","r",stdin);
      freopen("arbint.out","w",stdout);
      scanf("%d%d",&n,&m);
      for(i=1;i<=n;i++)
      {
            scanf("%d",&val);
            pos=i;
            update(1,1,n);
      }

      for(i=1;i<=m;i++)
      {
            scanf("%d",&op);
            if(!op)
            {
                  scanf("%d%d",&a,&b);
                  max=-1;
                  query(1,1,n);
                  printf("%d\n",max);
            }
            else
            {
                  scanf("%d%d",&pos,&val);
                  update(1,1,n);
            }
      }
      return 0;
}