Cod sursa(job #1460710)

Utilizator mirupetPetcan Miruna mirupet Data 13 iulie 2015 17:14:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<cstdio>
using namespace std;

#define dim 100001

int N, M;
int arb[4*dim];
int start, stop, val, poz, maxx;

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

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

int main()
    {
        freopen("arbint.in","r",stdin);
        freopen("arbint.out","w",stdout);
        scanf("%d%d", &N, &M);
        int x, a, b;

        for ( int i = 1; i <= N; i++)
        {
            scanf("%d", &x);
            poz = i;
            val = x;
            Update( 1, 1, N);
        }

        for ( int i = 1; i <= M; i++)
        {
            scanf("%d%d%d", &x, &a, &b);
            if ( x == 0 )
            {
                maxx = -189;
                start = a, stop = b;
                Query( 1, 1, N);
                printf("%d\n", maxx);
            }
            else
            {
                poz = a; val = b;
                Update( 1, 1, N);
            }
        }
    }

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

    int div = (st + dr)/2;
    if (poz <= div) Update(2*nod, st, div);
    else Update(2*nod + 1, div + 1, dr);

    arb[nod] =  MAXIM( arb[2*nod], arb[2*nod + 1] );
}

void Query(int nod, int st, int dr)
{
     if ( start <= st && dr <= stop )
     {
          if ( maxx < arb[nod] ) maxx = arb[nod];
          return;
     }

     int div = (st + dr)/2;
     if ( start <= div ) Query(2*nod,st,div);
     if ( div < stop ) Query(2*nod+1,div+1,dr);
}