Submission #1149660

#TimeUsernameProblemLanguageResultExecution timeMemory
1149660PersiaMeteors (POI11_met)C++17
100 / 100
902 ms61024 KiB
#include <bits/stdc++.h>

using namespace std;

#define bit(i, x) (x >> i & 1)
#define ll long long
#define sz(x) (int)x.size()

const int N = 3e5 + 5;
const int mod = 998244353;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ll rnd(ll l, ll r) {
    return uniform_int_distribution<ll>(l, r)(rng);
}

int n, m;
int o[N], p[N];
int k;
array<int, 3> q[N];

vector<int> adj[N];
int L[N], R[N], res[N];
ll sum[N];
vector<int> qq[N];

struct BIT{
    vector<ll> bit;
    int n;

    BIT(int _n = 0) {
        n = _n;
        bit.assign(n + 3, 0);
    }

    void reset() {
        for(int i = 1; i <= n; i++) bit[i] = 0;
    }

    void update(int u, ll x) {
        if(u < 1 || u > n) return;
        for(int i = u; i <= n; i += i & -i) bit[i] += x;
    }

    void rangeupdate(int u, int v, ll x) {
        if(u <= v) {
            update(u, x);
            update(v + 1, -x);
        }
        else {
            update(1, x);
            update(v + 1, -x);
            update(u, x);
            update(n + 1, -x);
        }
    }

    ll get(int u) {
        ll s = 0;
        for(int i = u; i > 0; i -= i & -i) s += bit[i];
        return s;
    }
};

signed main(int argc, char* argv[]) {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        cin >> o[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> p[i];
    }
    cin >> k;
    for(int i = 1; i <= k; i++) {
        int l, r, x; cin >> l >> r >> x;
        q[i] = {l, r, x};
    }

    for(int i = 1; i <= n; i++) {
        L[i] = 1;
        R[i] = k;
        res[i] = -1;
    }
    for(int i = 1; i <= m; i++) {
        adj[o[i]].push_back(i);
    }

    BIT t(m);
    bool flag = 1;
    while(flag) {
        flag = 0;
        for(int i = 1; i <= n; i++) if(L[i] <= R[i]) {
            int mid = (L[i] + R[i]) / 2;
            qq[mid].push_back(i);
            flag = 1;
        }
        if(!flag) break;
        for(int i = 1; i <= k; i++) {
            auto [l, r, x] = q[i];
            t.rangeupdate(l, r, x);
            while(!qq[i].empty()) {
                int u = qq[i].back();
                qq[i].pop_back();
                for(int j : adj[u]) {
                    sum[u] += t.get(j);
                    if(sum[u] >= p[u]) break;
                }
                if(sum[u] >= p[u]) {
                    res[u] = i;
                    R[u] = i - 1;
                }
                else L[u] = i + 1;
            }
        }
        t.reset();
        for(int i = 1; i <= n; i++) sum[i] = 0;
    }

    for(int i = 1; i <= n; i++) {
        if(res[i] == -1) cout << "NIE";
        else cout << res[i];
        cout << "\n";
    }

    return 0 ^ 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...