Cod sursa(job #710596)

Utilizator mytzuskyMihai Morcov mytzusky Data 10 martie 2012 10:51:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <stdio.h>

#define nn 100001

using namespace std;

int arb[nn], n, m, maxx=-1;

void update(int poz, int val, int nod, int st, int dr)
{
    if(st == dr)
        arb[nod] = val;
    else
    {
        int mij = (st+dr)/2;
        if(poz <= mij)
            update( poz, val, 2*nod  , st,    mij );
        else
            update( poz, val, 2*nod+1, mij+1, dr  );
    }
    arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}

void cautare(int A, int B, int nod, int st, int dr)
{
    if( A <= st && dr <= B && arb[nod] > maxx )
        maxx = arb[nod];
    else
    {
        int mij = (st+dr)/2;
        if( A <= mij )
                cautare(A, B, 2*nod,   st,    mij );
        else
            if( mij < B )
                cautare(A, B, 2*nod+1, mij+1, dr  );
    }
}

void citire()
{


    scanf("%d %d", &n, &m);

    int x;
    for(int i=1; i<=n ;i++)
    {
        scanf("%d", &x);
        update(i, x, 1, 1, n);
    }

    int op, a, b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d", &op, &a, &b);
        if( op == 1 ) // Valoarea elementului de pe pozita a va deveni b.
            update(a, b, 1, 1, n);
        else // op=0 maximu' din int [a,b]
        {
            maxx=-1;
            cautare(a, b, 1, 1, n);

            printf("%d\n", maxx);
        }
    }
}



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

    citire();

    return 0;
}