Cod sursa(job #1542192)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 5 decembrie 2015 09:23:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <algorithm>

using namespace std;

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

    int mij = (a + b) / 2;
    if (a <= poz && poz <= mij) add (nod << 1, poz, x, a, mij);
    else add ((nod << 1) + 1, poz, x, mij + 1, b);

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

inline int querry (int nod, int poz1, int poz2, int a, int b)
{
    if (poz1 <= a && b <= poz2)
        return v[nod];

    int mij = (a + b) / 2, x1 = 0, x2 = 0;
    if (poz1 <= mij) x1 = querry (nod << 1, poz1, poz2, a, mij);
    if (poz2 > mij) x2 = querry ((nod << 1) + 1, poz1, poz2, mij + 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)
    {
        int x;
        scanf ("%d", &x);
        add (1, i, x, 1, n);
    }

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

        if (op)
        {
            add (1, a, b, 1, n);
            continue;
        }

        printf ("%d\n", querry (1, a, b, 1, n));
    }

    return 0;
}