Cod sursa(job #2712233)

Utilizator flibiaVisanu Cristian flibia Data 25 februarie 2021 14:23:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define fi first
#define se second 
#define ll long long

using namespace std;

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

int n, m;
vector<int> aint;

void update(vector<int> &aint, int st, int dr, int node, int id, int val) {
    if (st == dr) {
        aint[node] = val; 
        return;
    }

    int mid = (st + dr) / 2;
    if (id <= mid) {
        update(aint, st, mid, 2 * node, id, val);
    } else {
        update(aint, mid + 1, dr, 2 * node + 1, id , val);
    }

    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
} 

int query(vector<int> &aint, int st, int dr, int node, int l, int r) {
    if (l <= st && dr <= r) {
        return aint[node];
    }

    int mid = (st + dr) / 2;
    int left = 0, right = 0;
    if (l <= mid) {
        left = query(aint, st, mid, 2 * node, l, r);
    }
    if (r > mid) {
        right = query(aint, mid + 1, dr, 2 * node + 1, l, r);
    }

    return max(left, right);
}

int main() {
    in >> n >> m;
    aint = vector<int>(4 * n + 1, 0);

    for (int i = 1, x; i <= n; i++) {
        in >> x;
        update(aint, 1, n, 1, i, x);
    }

    for (int t, x, y; m--; ) {
        in >> t >> x >> y;

        if (t == 0) {
            out << query(aint, 1, n, 1, x, y) << '\n';
        } else {
            update(aint, 1, n, 1, x, y);
        }
    }

    return 0;
}