Cod sursa(job #713808)

Utilizator Sm3USmeu Rares Sm3U Data 14 martie 2012 23:12:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <cstdio>
#define nMax 100100
#define max(a,b) ((a>b)?a:b)

using namespace std;

int n;
int m;
int a[nMax * 4];
int val;
int pozitie;
int intervalStanga;
int intervalDreapta;
int maxim;

void interval (int nod, int st, int dr)
{
    if (st >= intervalStanga && dr <= intervalDreapta){
        maxim = max (maxim, a[nod]);
        return;
    }
    int mij = (st + dr) >> 1;
    if (intervalStanga <= mij){
        interval (nod * 2, st, mij);
    }
    if (intervalDreapta > mij){
        interval (nod * 2 + 1, mij + 1, dr);
    }
}

void baga (int nod, int st, int dr)
{
    if (st == dr){
        a[nod] = val;
        return ;
    }
    int mij = (st + dr) >> 1;
    if (pozitie > mij){
        baga (nod * 2 + 1, mij + 1, dr);
    }else{
        baga (nod * 2, st, mij);
    }
    a[nod] = max (a[nod * 2], a[nod * 2 + 1]);
}

void citire()
{
    scanf ("%d %d", &n, &m);
    for (int i = 1; i <= n; ++ i){
        scanf ("%d", &val);
        pozitie = i;
        baga (1, 1, n);
    }
}

void rez()
{
    for (int i = 0; i < m; ++ i){
        int caz;
        int x;
        int y;
        scanf ("%d %d %d", &caz, &x, &y);
        if (caz == 1){
            val = y;
            pozitie = x;
            baga (1, 1, n);
        }else{
            maxim = -1;
            intervalStanga = x;
            intervalDreapta = y;
            interval (1, 1, n);
            printf ("%d\n", maxim);
        }
    }
}

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

    citire();
    rez();

    return 0;
}