Submission #1298802

#TimeUsernameProblemLanguageResultExecution timeMemory
1298802ApiramMeteors (POI11_met)C++20
100 / 100
836 ms33140 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Update {
    int l, r;
    long long v;
};


const int MAXN = 300005;
long long tree[MAXN];
int m;
int ans[MAXN];


vector<vector<int>> member_sectors;
vector<long long> targets;
vector<Update> updates;

inline void add(int x, long long val) {
    for (; x <= m; x += x & -x) tree[x] += val;
}

inline long long query(int x) {
    long long sum = 0;
    for (; x > 0; x -= x & -x) sum += tree[x];
    return sum;
}

inline void apply_update(int i, int type) {

    long long v = updates[i].v * type;
    if (updates[i].l <= updates[i].r) {
        add(updates[i].l, v);
        add(updates[i].r + 1, -v);
    } else {
        add(1, v);
        add(updates[i].r + 1, -v);
        add(updates[i].l, v);
    }
}

void solve(int L, int R, vector<int>& nations) {
    if (nations.empty()) return;

    if (L == R) {
        for (int id : nations) ans[id] = L;
        return;
    }

    int mid = (L + R) >> 1;


    for (int i = L; i <= mid; ++i) {
        apply_update(i, 1);
    }

    vector<int> type(nations.size());
    vector<long long> collected_sums(nations.size());

    for (int i = 0; i < nations.size(); ++i) {
        int id = nations[i];
        long long sum = 0;
        

        for (int sector : member_sectors[id]) {
            sum += query(sector);
            if (sum >= targets[id]) break; 
        }
        
        collected_sums[i] = sum;
        
        if (sum >= targets[id]) {
            type[i] = 0; 
        } else {
            type[i] = 1;
        }
    }

    for (int i = L; i <= mid; ++i) {
        apply_update(i, -1);
    }

    vector<int> left_nations, right_nations;
    left_nations.reserve(nations.size() / 2);
    right_nations.reserve(nations.size() / 2);

    for (int i = 0; i < nations.size(); ++i) {
        if (type[i] == 0) {
            left_nations.push_back(nations[i]);
        } else {
            targets[nations[i]] -= collected_sums[i];
            right_nations.push_back(nations[i]);
        }
    }

    vector<int>().swap(nations);


    solve(L, mid, left_nations);
    solve(mid + 1, R, right_nations);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);


    int n;
    if (!(cin >> n >> m)) return 0;

    member_sectors.resize(n);
    for (int i = 0; i < m; ++i) {
        int x; cin >> x;
        member_sectors[x - 1].push_back(i + 1);
    }

    targets.resize(n);
    for (int i = 0; i < n; ++i) cin >> targets[i];

    int k; cin >> k;
    updates.resize(k);
    for (int i = 0; i < k; ++i) {
        cin >> updates[i].l >> updates[i].r >> updates[i].v;
    }

    vector<int> all_nations(n);
    for (int i = 0; i < n; ++i) all_nations[i] = i;


    solve(0, k, all_nations);

    for (int i = 0; i < n; ++i) {
        if (ans[i] >= k) cout << "NIE\n";
        else cout << ans[i] + 1 << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...