Cod sursa(job #2480155)

Utilizator nTropicGravityesadasdwaadwqafr nTropicGravity Data 24 octombrie 2019 23:29:22
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include    <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

#define LIMIT 500005

int N, M, A, B, X, Key, G[LIMIT];

void Update(int Val, int Pos, int Left = 1, int Right = N, int Node = 1) {
    if (Left == Right) {
        G[Node] = Val;
        return;
    }

    int Mid = (Left + Right) >> 1;

    if (Pos <= Mid)
        Update(Val, Pos, Left, Mid, Node << 1);

    else
        Update(Val, Pos, Mid + 1, Right, (Node << 1) + 1);

    G[Node] = max(G[Node << 1], G[(Node << 1) + 1]);
}

int Query(int Start, int Finish, int Left = 1, int Right = N, int Node = 1) {
    if (Start <= Left && Finish >= Right)
        return G[Node];

    int Result = 0;
    int Mid = (Left + Right) >> 1;

    if (Start <= Mid)
        Result = max(Result, Query(Start, Finish, Left, Mid, Node << 1));

    else
        Result = max(Result, Query(Start, Finish, Mid + 1, Right, (Node << 1) + 1));

    return Result;
}

int main() {
    fin >> N >> M;

    for (int i = 1; i <= N; i++) {
        fin >> X;

        Update(X, i);
    }

    while (M--) {
        fin >> Key >> A >> B;

        if (Key)
            Update(B, A);

        else
            fout << Query(A, B) << "\n";
    }
}