Submission #701338

#TimeUsernameProblemLanguageResultExecution timeMemory
701338PurpleCrayonMeasures (CEOI22_measures)C++17
100 / 100
436 ms43256 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define sz(v) int(v.size())
#define ar array
typedef long long ll;
const int N = 2e5+20, MOD = 998244353;
const ll INF = 1e18+10;

#include <bits/extc++.h>
using namespace __gnu_pbds;

template<class T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

struct T {
    ll max_active, min_active, ans, lazy;

    T() {
        max_active = -INF;
        min_active = INF;
        ans = lazy = 0;
    }

    T(ll x) {
        max_active = min_active = x;
        ans = lazy = 0;
    }

    friend T operator + (const T& a, const T& b) {
        T ret = T();
        ret.max_active = max(a.max_active, b.max_active);
        ret.min_active = min(a.min_active, b.min_active);
        ret.ans = max({a.ans, b.ans, b.max_active - a.min_active});

        return ret;
    }
};

vector<T> t;

void push(int v, int tl, int tr, ll x) {
    t[v].max_active += x;
    t[v].min_active += x;

    if (tl != tr)
        t[2*v].lazy += x, t[2*v+1].lazy += x;
}

void app(int v, int tl, int tr) {
    push(v, tl, tr, t[v].lazy);
    t[v].lazy = 0;
}

void upd(int v, int tl, int tr, int l, int r, ll x) {
    app(v, tl, tr);
    if (r < tl || l > tr) return;
    if (l <= tl && tr <= r) {
        push(v, tl, tr, x);
        return;
    }

    int tm = (tl + tr) / 2;
    upd(2*v, tl, tm, l, r, x), upd(2*v+1, tm+1, tr, l, r, x);
    t[v] = t[2*v] + t[2*v+1];
}

void activate(int v, int tl, int tr, int i, ll x) {
    app(v, tl, tr);
    if (i < tl || i > tr) return;
    if (tl == tr) {
        t[v] = T(x);
        return;
    }

    int tm = (tl + tr) / 2;
    activate(2*v, tl, tm, i, x), activate(2*v+1, tm+1, tr, i, x);
    t[v] = t[2*v] + t[2*v+1];
}

void solve() {
    int n, m, d; cin >> n >> m >> d;
    vector<int> a(n); for (auto& x : a) cin >> x;
    vector<int> b(m); for (auto& x : b) cin >> x;

    vector<pair<int, int>> v;
    for (int i = 0; i < n; i++) {
        v.emplace_back(a[i], i);
    }
    for (int i = 0; i < m; i++) {
        v.emplace_back(b[i], n + i);
    }

    sort(v.begin(), v.end());

    vector<int> loc_a(n), loc_b(m);
    for (int i = 0; i < n + m; i++) {
        if (v[i].second < n) {
            loc_a[v[i].second] = i;
        } else {
            loc_b[v[i].second - n] = i;
        }
    }

    oset<int> s;
    t.assign(4 * (n + m), T());

    auto add = [&](int i, ll x) {
        activate(1, 0, n + m - 1, i, (long long) d * s.order_of_key(i) - x);
        s.insert(i);

        upd(1, 0, n + m - 1, i + 1, n + m - 1, d);
    };


    for (int i = 0; i < n; i++) {
        add(loc_a[i], a[i]);
    }

    for (int i = 0; i < m; i++) {
        add(loc_b[i], b[i]);

        app(1, 0, n + m - 1);
        ll ans = t[1].ans;
        cout << ans / 2;
        if (ans % 2) cout << ".5";
        cout << ' ';
    }
    cout << '\n';
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...