Cod sursa(job #540913)

Utilizator irene_mFMI Irina Iancu irene_m Data 24 februarie 2011 16:38:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#define infile "arbint.in"
#define outfile "arbint.out"
#define MaxN 100005
#define fs(x) (x)*2
#define fd(x) (x)*2+1

int arb[4*MaxN];
int N,M,op,i,a,b;
int val,pos,max;

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

void Update(int nod,int st,int dr)
{
      if(st==dr)
      {
            arb[nod]=val;
            return;
      }

      int m=(st+dr)/2;
      if(pos<=m)
            Update(fs(nod),st,m);
      else
            Update(fd(nod),m+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(arb[nod]>max) max=arb[nod];
            return;
      }

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



int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"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%d%d",&op,&a,&b);
            if(!op)
            {
                  max=-1;
                  Query(1,1,N);
                  printf("%d\n",max);
            }
            else
            {
                  pos=a; val=b;
                  Update(1,1,N);
            }
      }

      fclose(stdin);
      fclose(stdout);
      return 0;
}