Submission #1145871

#TimeUsernameProblemLanguageResultExecution timeMemory
1145871Kel_Mahmut새로운 문제 (POI11_met)C++20
100 / 100
2354 ms53188 KiB
#include <bits/stdc++.h> #define pb push_back // #define endl ("\n") #define all(aa) aa.begin(), aa.end() typedef long long ll; using namespace std; struct fenwick{ int n; vector<ll> fen; fenwick(int n) : n(n), fen(n) {} void add(int i, ll val){ for(; i < n; i |= i + 1) fen[i] += val; } void reset(){ for(int i = 0; i < n; i++) fen[i] = 0; } ll query(int i){ ll ret = 0; for(; i >= 0; i = (i & (i + 1)) - 1) ret += fen[i]; return ret; } ll query(int l, int r){ return query(r) - query(l - 1); } }; int main(){ // ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; // m tane eleman var, n tane marka var vector<ll> a(m); vector<ll> p(n); for(int i = 0; i < m; i++) cin >> a[i], a[i]--; for(int i = 0; i < n; i++) cin >> p[i]; int q; cin >> q; vector<array<ll, 3>> s; s.pb({0, 0, 0}); for(int i = 0; i < q; i++){ ll l, r, x; cin >> l >> r >> x; l--, r--; s.pb({l, r, x}); } fenwick fen(m); auto Apply = [&](int i){ auto [l, r, x] = s[i]; if(l <= r){ fen.add(l, x); fen.add(r + 1, -x); } else{ fen.add(0, x); fen.add(r + 1, -x); fen.add(l, x); } }; queue<array<ll, 4>> search; // tm, marka, tl, tr vector<array<ll, 4>> new_search; // aynisi ama yeni queryler icin ll tl = 0, tr = q + 1; for(int i = 0; i < n; i++){ search.push({(tl + tr) / 2, i, tl, tr}); } vector<vector<int>> gec(n); for(int i = 0; i < m; i++){ gec[a[i]].pb(i); } vector<ll> ans(n); for(int rep = 0; rep < 40; rep++){ for(int i = 0; i <= q; i++){ Apply(i); while(!search.empty() && search.front()[0] == i){ ll cev = 0; auto [tm, marka, tl, tr] = search.front(); search.pop(); for(int ind : gec[marka]){ cev += fen.query(ind); if(cev >= p[marka]) break; } if(cev >= p[marka]){ ll new_tr = tm; ll new_tm = (tl + new_tr) / 2; new_search.pb({new_tm, marka, tl, new_tr}); } else{ ll new_tl = tm; ll new_tm = (new_tl + tr) / 2; new_search.pb({new_tm, marka, new_tl, tr}); } } } assert(search.empty()); sort(all(new_search)); for(auto ar : new_search){ search.push(ar); ans[ar[1]] = ar[3]; } new_search.clear(); fen.reset(); } for(int i = 0; i < n; i++){ if(ans[i] == q + 1) cout << "NIE" << endl; else cout << ans[i] << endl; } }
#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...