Submission #1104928

#TimeUsernameProblemLanguageResultExecution timeMemory
1104928IrateMeteors (POI11_met)C++17
100 / 100
2829 ms57792 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(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(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...