제출 #1315365

#제출 시각아이디문제언어결과실행 시간메모리
1315365nambanana987새로운 문제 (POI11_met)C++20
74 / 100
2266 ms87640 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
#define sz(a) (int)a.size()
struct SegmentTree {
    vector<long long> lazy;

    void init(int n) {
        lazy.assign(4*n, 0);
    }

    void update(int id, int l, int r, int u, int v, int val) {
        if(l>v || r<u) return;
        if(l>=u && r<=v) {
            lazy[id] += val;
            return;
        }
        int mid = l + r >> 1;
        update(id*2, l, mid, u, v, val);
        update(id*2+1, mid+1, r, u, v, val);
    }
    int get(int id, int l , int r, int p) {
        if(l==r) {
            return lazy[id];
        }
        int mid = l + r >> 1;
        if(mid>=p) return get(id*2, l, mid, p) + lazy[id];
        return get(id*2+1, mid+1, r, p) + lazy[id];
    }

};

struct event{
    int l, r, v;
};

void solve() {
    int n, m; cin >> n >> m;
    vector<int> have[n+5];
    int a[n+5];
    for(int i=1; i<=m; i++) {
        int c; cin >> c;
        have[c].push_back(i);
    }

    for(int i=1; i<=n; i++) cin >> a[i];

    int k; cin >> k;
    vector<event> query(k+5);
    for(int i=1; i<=k; i++) cin >> query[i].l >> query[i].r >> query[i].v;
    vector<int> l(n+5, 1);
    vector<int> r(n+5, k+1);

    bool flag = true;
    vector<int> can[k+5];
    SegmentTree tree;
    tree.init(m+5);
    while(flag) {
        flag = false;
        for(int i=1; i<=n; i++) {
            if(l[i]>=r[i]) continue;
            flag = true;
            int mid= l[i] + r[i] >> 1;
            can[mid].push_back(i);
        }
        if(!flag) break;

        for(int i=1; i<=k; i++) {
            if(query[i].l > query[i].r) {
                tree.update(1, 1, m, query[i].l, m, query[i].v);
                tree.update(1, 1, m, 1, query[i].r, query[i].v);
            }
            else tree.update(1, 1, m, query[i].l, query[i].r, query[i].v);

            for(int p: can[i]) {
                long long res = 0;
                for(int c: have[p]) {
                    res += tree.get(1, 1, m, c);
                    if(res >= a[p]) break;
                }
                if(res >= a[p]) r[p] = i;
                else l[p] = i+1;

            }
            can[i].clear();
        }
        tree.init(m+5);
    }

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


}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...