Submission #1104925

#TimeUsernameProblemLanguageResultExecution timeMemory
1104925IrateMeteors (POI11_met)C++17
100 / 100
2673 ms58044 KiB
#include<bits/stdc++.h>
using namespace std;
const int LOG = 20;
struct Query{
    int l, r, a;
};
struct T{
    int l, r, ans = -1;
};
struct BIT{
    vector<long long>fen;
    int sz;
    BIT(int n){
        sz = n;
        fen.resize(n + 1);
    }
    void Update(int pos, int val){
        while(pos <= sz){
            fen[pos] += val;
            pos += (pos & -pos);
        }
    }
    long long Sum(int pos){
        long long sum = 0;
        while(pos > 0){
            sum += fen[pos];
            pos -= (pos & -pos);
        }
        return sum;
    }
};
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> m >> n;
    vector<int>v(n + 1), need(m + 1);
    vector<vector<int>>pos(m + 1);
    vector<T>intervals(m + 1);
    for(int i = 1;i <= n;++i){
        cin >> v[i];
        pos[v[i]].push_back(i);
    }
    for(int i = 1;i <= m;++i){
        cin >> need[i];
    }
    int q;
    cin >> q;
    vector<vector<int>>timeline(q);
    vector<Query>queries(q);
    for(int i = 1;i <= m;++i){
        timeline[(q - 1) / 2].push_back(i);
        intervals[i] = {0, q - 1};
    }
    for(int i = 0;i < q;++i){
        int l, r, a;
        cin >> l >> r >> a;
        queries[i] = {l, r, a};
    }
    BIT tree(n + 1);
    for(int i = 0;i < LOG;++i){
        for(int j = 0;j < q;++j){
            int l = queries[j].l, r = queries[j].r, a = queries[j].a;
            if(l <= r){
                tree.Update(l, a);
                tree.Update(r + 1, -a);
            }
            else{
                tree.Update(l, a);
                tree.Update(n + 1, -a);
                tree.Update(1, a);
                tree.Update(r + 1, -a);
            }
            while(!timeline[j].empty()){
                int base = timeline[j].back();
                timeline[j].pop_back();
                l = intervals[base].l, r = intervals[base].r;
                int ans = intervals[base].ans;
                long long tot = 0;
                for(int &p : pos[base]){
                    tot += tree.Sum(p);
                    if(tot >= need[base]){
                        break;
                    }
                }
                if(tot >= need[base]){
                    intervals[base] = {l, (l + r) / 2 - 1, (l + r) / 2};
                }
                else{
                    intervals[base] = {(l + r) / 2 + 1, r, ans};
                }
            }
        }
        for(int j = 1;j <= m;++j){
            timeline[(intervals[j].l + intervals[j].r) / 2].push_back(j);
        }
        for(int j = 0;j < q;++j){
            int l = queries[j].l, r = queries[j].r, a = queries[j].a;
            if(l <= r){
                tree.Update(l, -a);
                tree.Update(r + 1, a);
            }
            else{
                tree.Update(l, -a);
                tree.Update(n + 1, a);
                tree.Update(1, -a);
                tree.Update(r + 1, a);
            }
        }
    }
    for(int i = 1;i <= m;++i){
        int ans = intervals[i].ans;
        if(ans < 0){
            cout << "NIE\n";
        }
        else{
            cout << ans + 1 << '\n';
        }
    }
}
#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...