Cod sursa(job #2952441)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 9 decembrie 2022 11:15:23
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 100005;

int ls(int x) {
    return 2 * x;
}

int rs(int x) {
    return 2 * x + 1;
}

int aint[Nmax * 4];
int v[Nmax];

int l, r, pos;

void build(int p, int q, int node) {
    if (p == q) {
        aint[node] = v[p];
    }
    else {
        int mid = (p + q) >> 1;
        build(p, mid, ls(node));
        build(mid + 1, q, rs(node));
        aint[node] = max(aint[ls(node)], aint[rs(node)]);
    }
}

void update(int p, int q, int node) {
    if (p == q and p == pos) {
        aint[node] = v[pos];
    }
    else {
        int mid = (p + q) >> 1;
        if (pos <= mid)
            update(p, mid, ls(node));
        else
            update(mid + 1, q, rs(node));
        aint[node] = max(aint[ls(node)], aint[rs(node)]);
    }
}

int query(int p, int q, int node) {
    if (l <= p and q <= r)
        return aint[node];

    int mid = (p + q) >> 1;
    int ans1 = INT_MIN, ans2 = INT_MIN;
    if (l <= mid)
        ans1 = query(p, mid, ls(node));
    if (mid + 1 <= r)
        ans2 = query(mid + 1, q, rs(node));
    
    return max(ans1, ans2);
}

int main() {
    ifstream cin("arbint.txt");
    ofstream cout("arbint.txt");

    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> v[i];
    build(1, n, 1);

    while (m--) {
        int op, x, y;
        cin >> op >> x >> y;
        if (op == 0) {
            l = x;
            r = y;
            cout << query(1, n, 1) << '\n';
        }
        else {
            pos = x;
            v[x] = y;
            update(1, n, 1);
        }
    }

    return 0;
}