Cod sursa(job #2875971)

Utilizator mex7Alexandru Valentin mex7 Data 22 martie 2022 19:06:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
#define ll long long
#define cin fin
#define cout fout
using namespace std;

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

int n, m;
int cost[400010], v[100001], logBase2[100001];

void update(int node, int l, int r, int ind, int val) {
    // cout << l << ' ' << r << '\n';
    if (l == r) {
        cost[node] = val;
        return;
    }

    int mid = (l + r) / 2;
    if (ind >= l && ind <= mid)
        update(2 * node, l, mid, ind, val);
    else
        update(2 * node + 1, mid + 1, r, ind, val);

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

int query(int node, int l, int r, int wantL, int wantR) {
    // cout << l << ' ' << r << '\n';
    if (l >= wantL && r <= wantR)
        return cost[node];

    int currMax = 0;
    int mid = (l + r) / 2;
    if (wantL <= mid)
        currMax = max(currMax, query(2 * node, l, mid, wantL, wantR));
    if (wantR > mid)
        currMax = max(currMax, query(2 * node + 1, mid + 1, r, wantL, wantR));

    return currMax;
}

int main() {
    ios :: sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 2; i <= n; ++i)
        logBase2[i] = logBase2[i / 2] + 1;
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
        // cout << i << ":\n";
        update(1, 1, n, i, v[i]);
    }

    for (int q = 1; q <= m; ++q) {
        int type;

        cin >> type;
        if (type) {
            int ind, val;

            cin >> ind >> val;
            v[ind] = val;
            update(1, 1, n, ind, val);
        } else {
            int wantL, wantR;

            cin >> wantL >> wantR;
            cout << query(1, 1, n, wantL, wantR) << '\n';
        }
    }

    // for (int i = 1; i <= n; ++i)
        // for (int j = i; j <= n; ++j) {
            // cout << '(' << i << ", " << j << ") -> " << query(1, 1, n, i, j) << '\n';
        // }
        // cout << query(1, n, 3, 4);

    // cout << cost[1][2];
    // for (int i = 1; i <= n; ++i)
        // cout << cost[i][0] << ' ';

    return 0;
}