Cod sursa(job #1442864)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 26 mai 2015 15:01:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 100000 + 1;

int T[2 * Nmax];
int N, M;

void build()
{
    for (int i = N - 1; i >= 1; i--)
        T[i] = max(T[(i << 1)], T[(i << 1) | 1]);
}

void update(int x, int value)
{
    x += N;

    T[x] = value;

    while (x > 1)
    {
        T[x >> 1] = max(T[x], T[x ^ 1]);
        x >>= 1;
    }
}

int query(int x, int y) /// [x, y)
{
    x += N;
    y += N;

    int sol = numeric_limits<int>::min();

    while (x < y)
    {
        if (x & 1)
        {
            sol = max(sol, T[x]);
            x++;
        }

        if (y & 1)
        {
            y--;
            sol = max(sol, T[y]);
        }

        x >>= 1;
        y >>= 1;
    }

    return sol;
}

int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    in >> N >> M;

    for (int i = 0; i < N; ++i)
        in >> T[i + N];

    build();

    for (int i = 1; i <= M; ++i)
    {
        int tip, a, b;
        in >> tip >> a >> b;

        a--; b--;

        if (tip == 0)
            out << query(a, b + 1) << "\n";
        else
            update(a, b + 1);
    }

    return 0;
}