Untitled

 avatar
unknown
c_cpp
a year ago
2.6 kB
18
Indexable
#include <vector>
#include <iostream>
#include <map>
#include <algorithm>
#include <queue>

using namespace std;

vector<int> d_max;
vector<int> child_info;

void update_child(int v, int l_v, int r_v, int new_val) {
    d_max[v] = new_val;
    if (l_v != r_v - 1) {
        child_info[v] = new_val;
    }
}

int do_max(int v, int l_v, int r_v, int l_q, int r_q) {
    if (child_info[v] != 0) {
        update_child(v*2,   l_v, (l_v+r_v)/2, child_info[v]);
        update_child(v*2+1, (l_v+r_v)/2, r_v, child_info[v]);
        child_info[v] = 0;
    }
    if (l_q <= l_v && r_v <= r_q) {
        return d_max[v];
    }
    if (r_q <= l_v || l_q >= r_v) {
        return INT_MIN;
    }
    return max(do_max(v*2,   l_v, (l_v+r_v)/2, l_q, r_q),
               do_max(v*2+1, (l_v+r_v)/2, r_v, l_q, r_q));
}

void update(int v, int l_v, int r_v, int l_q, int r_q, int new_val) {
    if (child_info[v] != 0) {
        update_child(v*2,   l_v, (l_v+r_v)/2, child_info[v]);
        update_child(v*2+1, (l_v+r_v)/2, r_v, child_info[v]);
        child_info[v] = 0;
    }
    if (l_q <= l_v && r_v <= r_q) {
        // целиком обновить отрезок
        d_max[v] = new_val;
        if (l_v != r_v - 1) {
            // запоминаю про обновление детей, только если они есть
            child_info[v] = new_val;
        }
        return;
    }
    if (r_q <= l_v || l_q >= r_v) {
        // ничего не делать с отрезком
        return;
    }

    update(v*2,   l_v, (l_v+r_v)/2, l_q, r_q, new_val);
    update(v*2+1, (l_v+r_v)/2, r_v, l_q, r_q, new_val);
    d_max[v] = max(d_max[v*2], d_max[v*2+1]);
}

int main() {

    int n = 1;
    while (n < 100'000) {
        n *= 2;
    }

    d_max.resize(2*n);
    child_info.resize(2*n);

    for (long long i = 0; i < n; i++) {
        int el = (i + 1) * (i + 1) % 12345 + (i + 1) * (i + 1) * (i + 1) % 23456;
        d_max[n + i] = el;
    }
    for (int i = n - 1; i >= 1; i--) {
        // v, children: v*2, v*2+1
        d_max[i] = max(d_max[i*2], d_max[i*2+1]);
    }

    cout << do_max(1, 0, n, 0, 4) << "\n"; // 80 = 64 + 16

    update(1, 0, n, 0, 4, 100);

    cout << do_max(1, 0, n, 0, 5) << "\n"; // 150 = 125 + 25

    cout << do_max(1, 0, n, 0, 4) << "\n"; // 100

    cout << d_max[n + 2] << "\n"; // 36

    cout << do_max(1, 0, n, 2, 3) << "\n"; // 100

    cout << d_max[n+2] << "\n";

    cout << do_max(1, 0, n, 0, 1) << "\n"; // 100



}
Leave a Comment