Cod sursa(job #1498681)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 8 octombrie 2015 22:25:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include <algorithm>

#define DIM (1<<18)
#define INF (1<<30)
using namespace std;

int ArbInt[DIM], N, M, cod, X, Y;

int update (int node, int start, int finish, int left, int right, int value)
{
    if(left <= start && finish <= right)
        ArbInt[node] = value;
    else {
        int mid = start + ((finish - start) >> 1);
        int value1 = -INF;
        int value2 = -INF;

        if(left <= mid)
            value1 = update (node * 2    , start  , mid   , left, right, value);

        if(right > mid)
            value2 = update (node * 2 + 1, mid + 1, finish, left, right, value);

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

int query (int node, int start, int finish, int left, int right)
{
    if (left <= start && finish <= right)
        return ArbInt[node];
    else {
        int mid = start + ((finish - start) >> 1);
        int value1 = -INF;
        int value2 = -INF;

        if (left <= mid)
            value1 = query (node * 2    , start  , mid   , left, right);

        if (right > mid)
            value2 = query (node * 2 + 1, mid + 1, finish, left, right);

        return max (value1, value2);
    }
    return -1;
}

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

    scanf ("%d %d", &N, &M);

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

    for (int i = 1; i <= M; i ++)
    {
        scanf ("%d %d %d", &cod, &X, &Y);

        switch (cod)
        {
            case 0: {
                printf ("%d\n", query (1, 1, N, X, Y));
                break;
            }
            case 1: {
                update (1, 1, N, X, X, Y);
                break;
            }
        }
    }

    fclose (stdin );
    fclose (stdout);

    return 0;
}