Cod sursa(job #2816315)

Utilizator 2016Teo@Balan 2016 Data 11 decembrie 2021 11:34:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;

#define x1 "arbint.in"
#define x2 "arbint.out"

ifstream in(x1);
ofstream out(x2);

#define MAXN 100000 * 2


int v[MAXN], n;
int aint[MAXN];

void build(int l, int r, int node) {
    if (l == r) {
        aint[node] = v[l];
        return;
    }

    int mid, lChild, rChild;

    mid = (l + r) / 2;
    lChild = node + 1;
    rChild = node + 2 * (mid - l + 1);

    build(l, mid, lChild);
    build(mid + 1, r, rChild);

    aint[node] = max(aint[lChild], aint[rChild]);
}

void update(int l, int r, int node, int pos, int val) {
    if(l == r) {
        aint[node] = val;
        return;
    }

    int mid, lChild, rChild;

    mid = (r + l) / 2;
    lChild = node + 1;
    rChild = node + 2 * (mid - l + 1);

    if(pos <= mid)
        update(l, mid, lChild, pos, val);
    else
        update(mid + 1, r, rChild, pos, val);

    aint[node] = max(aint[lChild], aint[rChild]);
}

int maxi(int l, int r, int a, int b, int node) {
    if(l >= a && r <= b)
        return aint[node];

    int mid, lChild, rChild, MAX = 0;

    mid = (l + r) / 2;
    lChild = node + 1;
    rChild = node + 2 * (mid - l + 1);

    if(a <= mid)
        MAX = maxi(l, mid, a, b, lChild);

    if(b > mid)
        MAX = max(maxi(mid + 1, r, a, b, rChild), MAX);

    return MAX;
}


int main() {
    int cer, a, b, i, q;

    in >> n >> q;

    for(i = 0; i < n; i++)
        in >> v[i];

    build(0, n - 1, 0);

    while(q--) {
        in >> cer >> a >> b;

        if(cer == 1)
            update(0, n - 1, 0, a - 1, b);
        else
            out << maxi(0, n - 1, a - 1, b - 1, 0) << '\n';

    }
    return 0;
}