Cod sursa(job #2565861)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 2 martie 2020 17:20:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

#define MAXN    100005

#define FILENAME    std::string("arbint")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");

int N, M;
int V[MAXN];

int ST[4*MAXN];

#define LEFT   2*index
#define RIGHT  2*index+1
#define MIDDLE (left+right)/2
void build(int left = 1, int right = N, int index = 1) {
    if (left == right) { ST[index] = V[left]; return; }
    build(left, MIDDLE, LEFT);
    build(MIDDLE+1, right, RIGHT);
    ST[index] = std::max(ST[LEFT], ST[RIGHT]);
}
void update(int pos, int X, int left = 1, int right = N, int index = 1) {
    if (left == right) { ST[index] = X; return;}
    if (pos <= MIDDLE) update(pos, X, left, MIDDLE, LEFT);
    else               update(pos, X, MIDDLE+1, right, RIGHT);
    ST[index] = std::max(ST[LEFT], ST[RIGHT]);
}
int query(int A, int B, int left = 1, int right = N, int index = 1) {
    if (A <= left && right <= B) return ST[index];
    int max = -2e9;
    if (A <= MIDDLE) max = std::max(max, query(A, B, left, MIDDLE, LEFT));
    if (MIDDLE <  B) max = std::max(max, query(A, B, MIDDLE+1, right, RIGHT));
    return max;
}

int main()
{
    input >> N >> M;
    for (int i=1; i<=N; ++i) input >> V[i];
    build();
    int t, a, b;
    for (int i=1; i<=M; ++i) {
        input >> t >> a >> b;
        if (t == 0) output << query (a, b) << '\n';
        else        update(a, b);
    }

    return 0;
}