Cod sursa(job #1065404)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 23 decembrie 2013 12:05:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 100000;

int arb[4*MAXN], n, m;

void update_tree( int node, int left, int right, int position, int value )
{
    if( left == right )
    {
        arb[node] = value;
    }
    else
    {
        int m = (left+right)/2;

        if( m < position )
        {
            update_tree( 2*node +1 , m + 1, right, position, value );
        }
        else
        {
            update_tree( 2*node, left, m, position, value );
        }

        arb[node] = max( arb[2*node+1], arb[2*node] );
    }
}

void querry_tree( int node, int left, int right, int a, int b, int &answer )
{
    if( a <= left && right <= b )
    {
        answer = max(answer, arb[node]);
    }
    else
    {
        int m = (left + right) / 2;

        if( m < b )
        {
            querry_tree( 2*node+1, m + 1, right, a, b, answer );
        }
        if( a <= m )
        {
            querry_tree( 2*node, left, m, a, b, answer);
        }
    }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d", &n, &m);
    int i, value, aux = -1, x, a, b;

    for( i = 1; i <= n; i++ )
    {
        scanf("%d",&value);
        update_tree(1,1,n,i,value);
    }

    for( i = 1; i <= m; i++ )
    {
        aux = -1;
        scanf("%d %d %d", &x, &a, &b);

        if( x == 0 )
        {
            querry_tree(1,1,n,a,b,aux);
            printf("%d\n",aux);
        }
        else
        {
            update_tree(1,1,n,a,b);
        }
    }

    return 0;
}