Submission #942519

#TimeUsernameProblemLanguageResultExecution timeMemory
942519Clan328Meteors (POI11_met)C++17
74 / 100
4622 ms65536 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define nL '\n' #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() typedef long long ll; typedef long double ld; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vpii; typedef vector<ll> vl; typedef vector<vl> vvl; typedef pair<ll, ll> pll; typedef vector<pll> vpll; const ll MOD = 1e9 + 7; void settings()__attribute__((constructor)); // void eval(bool condition) { cout << (condition ? "yes" : "no") << nL; } // void Eval(bool condition) { cout << (condition ? "Yes" : "No") << nL; } // void EVAL(bool condition) { cout << (condition ? "YES" : "NO") << nL; } int ipow(int a, int n) { if (n == 0) return 1; int x = ipow(a, n/2); if (n % 2 == 0) return x*x; return x*x*a; } template <typename T> ostream& operator<<(ostream& stream, const vector<T>& v) { for (auto elem : v) stream << elem << " "; return stream; } template <typename T> istream& operator>>(istream& stream, vector<T>& v){ for(auto &elem : v) stream >> elem; return stream; } void settings() { #ifdef LOCAL freopen("io/input.txt", "r", stdin); freopen("io/output.txt", "w", stdout); #endif ios::sync_with_stdio(0); cin.tie(0); } struct Rain { int l, r; ll a; }; int LOG = 20; struct SegmentTree { vl t, lazy; SegmentTree(int n) { t = vl(2*n); lazy = vl(2*n); } void push(int v, int tl, int tm) { t[v+1] += lazy[v]; t[v+2*(tm-tl+1)] += lazy[v]; lazy[v+1] += lazy[v]; lazy[v+2*(tm-tl+1)] += lazy[v]; lazy[v] = 0; } void update(int v, int tl, int tr, int l, int r, int x) { if (l > r) return; if (l == tl && r == tr) { t[v] += x; lazy[v] += x; return; } int tm = (tl+tr)/2; push(v, tl, tm); update(v+1, tl, tm, l, min(r, tm), x); update(v+2*(tm-tl+1), tm+1, tr, max(tm+1, l), r, x); t[v] = max(t[v+1], t[v+2*(tm-tl+1)]); } ll get(int v, int tl, int tr, int l, int r) { if (l > r) return 0; if (l == tl && r == tr) return t[v]; int tm = (tl+tr)/2; push(v, tl, tm); return max(get(v+1, tl, tm, l, min(r, tm)), get(v+2*(tm-tl+1), tm+1, tr, max(tm+1, l), r)); } }; signed main() { int n, m; cin >> n >> m; vi o(m); cin >> o; for (int i = 0; i < m; i++) o[i]--; vl p(n); cin >> p; int k; cin >> k; vector<Rain> lr(k); for (int i = 0; i < k; i++) { cin >> lr[i].l >> lr[i].r >> lr[i].a; lr[i].l--; lr[i].r--; } vvi c(n); for (int i = 0; i < m; i++) { c[o[i]].pb(i); } // map<pair<int, pii>, vi> b; vector<vector<pair<int, pii>>> b(k); for (int i = 0; i < n; i++) b[(k-1)/2].pb({i, {0, k-1}}); vl res(n, -1); SegmentTree tree(m); while (LOG--) { tree.t = vl(2*m); tree.lazy = vl(2*m); int nxt = 0; vector<vector<pair<int, pii>>> tmp(k); for (int mid = 0; mid < k; mid++) { for (int i = nxt; i <= mid; i++) { if (lr[i].l <= lr[i].r) tree.update(1, 0, m-1, lr[i].l, lr[i].r, lr[i].a); else { tree.update(1, 0, m-1, lr[i].l, m-1, lr[i].a); tree.update(1, 0, m-1, 0, lr[i].r, lr[i].a); } nxt++; } for (auto key : b[mid]) { int l = key.second.first, r = key.second.second; int u = key.first; ll sum = 0; for (auto v : c[u]) { sum += tree.get(1, 0, m-1, v, v); } // // cout << u << " " << l << " " <<r<< nL; if (sum < p[u]) { if (mid+1 <= r) tmp[(mid+1+r)/2].pb({u, {mid+1, r}}); } else { if (l <= mid-1) tmp[(l+mid-1)/2].pb({u, {l, mid-1}}); res[u] = mid+1; } } } b = tmp; tmp.clear(); } for (int i = 0; i < n; i++) { if (res[i] != -1) cout << res[i] << nL; else cout << "NIE" << nL; } return 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...