Cod sursa(job #1011651)

Utilizator laszloasandorLaszlo Sandor laszloasandor Data 17 octombrie 2013 08:34:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <fstream>
#include <assert.h>
using namespace std;
#define fr(i,a,b) for(int i=a;i<=b;++i)

#define dim 100001

int n,m;
int MaxArb[4*dim+66];
int start, finish, Val, Pos, maxim;

inline int Maxim(int a,int b) {
  return a>b?a:b;
}

void Update(int,int,int);
void Query(int,int,int);

int main()
{
    int x,a,b;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d %d",&n,&m);
    fr(i,1,n)
    {
        scanf("%d",&x);
        Pos=i,Val=x;
        Update(1,1,n);
    }

    fr(i,1,m)
    {
        scanf("%d %d %d",&x,&a,&b);
        if(x==0)
        {
             maxim=-1;
             start=a;
             finish=b;
             Query(1,1,n);
             printf("%d\n",maxim);
        }
        else
        {
            Pos=a;Val=b;
            Update(1,1,n);
        }
    }
}

void Update(int nod,int left,int right)
{
     if(left==right)
     {
          MaxArb[nod]=Val;
          return;
     }

     int div=(left+right)/2;
     if(Pos<=div) Update(2*nod,left,div);
     else Update(2*nod+1,div+1,right);

     MaxArb[nod]=Maxim(MaxArb[2*nod],MaxArb[2*nod+1]);
}

void Query(int nod,int left,int right)
{
     if (start<=left&&right<=finish)
     {
          if(maxim<MaxArb[nod]) maxim=MaxArb[nod];
          return;
     }

     int div=(left+right)/2;
     if(start<=div) Query(2*nod,left,div);
     if(div<finish) Query(2*nod+1,div+1,right);
}