Cod sursa(job #1201870)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 26 iunie 2014 12:42:19
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[1 << 19], poz, x, y;

inline void add (int nod, int a, int b)
{
    if (a == poz && poz == b)
    {
        v[nod] = x;
        return;
    }

    int m = (a + b) / 2;

    if (poz <= m) add (nod * 2, a, m);
    else add (nod * 2 + 1, m + 1, b);

    v[nod] = max (v[2 * nod], v[2 * nod + 1]);
}

inline int ask (int nod, int a, int b)
{
    if (x <= a && b <= y) return v[nod];

    int m = (a + b) / 2, x1 = 0, x2 = 0;
    if (x <= m) x1 = ask (2 * nod, a, m);
    if (y > m) x2 = ask (2 * nod + 1, m + 1, b);

    return max (x1, x2);
}

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

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

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

        poz = i;
        add (1, 1, n);
    }

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

        if (!op)
        {
            x = a;
            y = b;
            printf ("%d\n", ask (1, 1, n));
        }
        else
        {
            poz = a;
            x = b;
            add (1, 1, n);
        }
    }

    return 0;
}