Cod sursa(job #2247252)

Utilizator gabib97Gabriel Boroghina gabib97 Data 28 septembrie 2018 11:10:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

#define N 100001

using namespace std;

int n, m, v[N], bit[263000], pos[N];

void bit_build(int k, int a, int b) {
    if (a == b) {
        bit[k] = v[a];
        pos[a] = k;
    } else {
        int m = (a + b) >> 1;
        bit_build(k << 1, a, m);
        bit_build(k << 1 | 1, m + 1, b);
        bit[k] = max(bit[k << 1], bit[k << 1 | 1]);
    }
}

void bit_update(int k) {
    if (k) {
        bit[k] = max(bit[k << 1], bit[k << 1 | 1]);
        bit_update(k >> 1);
    }
}

int bit_query(int k, int l, int r, int a, int b) {
    if (a <= l && r <= b) return bit[k];
    else {
        int m = (l + r) >> 1;
        int maxl = 0, maxr = 0;

        if (a <= m) maxl = bit_query(k << 1, l, m, a, b);
        if (m < b) maxr = bit_query(k << 1 | 1, m + 1, r, a, b);
        return max(maxl, maxr);
    }
}

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

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

    bit_build(1, 1, n);

    int t, a, b;
    while (m--) {
        fin >> t >> a >> b;
        if (t == 0)
            fout << bit_query(1, 1, n, a, b) << '\n';
        else {
            bit[pos[a]] = b;
            bit_update(pos[a] >> 1);
        }
    }

    return 0;
}