Cod sursa(job #1062232)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 20 decembrie 2013 21:32:39
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 100001;

class tree
{
private:

    int arb[4*MAXN];
    int n;

public:

    void setN( int x ) { n = x;};

    /*
    tree()
    {
        memset(arb,0,sizeof(arb));
    }
    */

    void add_node( int node , int left , int right , int value, int position)
    {
        if( left == right )
        {
            arb[node] = value;
            return ;
        }

            int m = (left+right)/2;

            if( m < position )
            {
                add_node(2*node+1,m+1,right,value,position);
            }
            else
            {
                add_node(2*node,left,m,value,position);
            }
            arb[node] = max( arb[2*node] , arb[2*node+1] );

    }

   void getIntervalMaximum( int node , int left , int right , int a , int b , int &answer )
   {
        if( a <= left && right <= b )
        {
            answer = max(arb[node],answer);
            return ;
        }

            int m = (left + right)/2;

            if( a <= m )
            {
                getIntervalMaximum(2*node, left, m, a, b, answer);
            }

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


    }

    /* debug
    void showTree()
    {
        int i ;
        for( i = 1;  i <= 4*n; i++ )
        {
            cout<<arb[i]<<' ';
        }
    }
    */

};

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

    int n, m, value, x, a, b;

    tree t;

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

    t.setN(n);

    for( int i = 1; i <= n; i++ )
    {
        scanf("%d", &value);
        int position = i;
        t.add_node(1,1,n,value,position);
    }

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

        if( x == 1 )
        {

            t.add_node(1,1,n,b,a);
        }
        else
        {
            int aux = -1;
            t.getIntervalMaximum(1,1,n,a,b,aux);
            printf("%d \n", aux);
        }
    }

    return 0;

}