Submission #548506

#TimeUsernameProblemLanguageResultExecution timeMemory
5485062fat2codeMeteors (POI11_met)C++17
61 / 100
4850 ms39832 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define all(a) (a).begin(), (a).end() #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #define fr first #define sc second //#define int long long #define rc(s) return cout<<s,0 #define rcc(s) cout<<s,exit(0) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int nmax = 300005; int n, m, k, a[nmax], x[nmax], y[nmax], ans[nmax], curr; long long tree[4*nmax], lazy[4*nmax], p[nmax], z[nmax]; vector<int>members[nmax]; void push(int l, int r, int nod){ tree[nod] += lazy[nod]; if(l != r){ lazy[2*nod] += lazy[nod]; lazy[2*nod + 1] += lazy[nod]; } lazy[nod] = 0; } void add(int l, int r, int le, int ri, int val, int nod){ push(l, r, nod); if(r < le || l > ri) return; else if(l >= le && r <= ri){ lazy[nod] += val; push(l, r, nod); } else{ int mid = l + (r - l) / 2; add(l, mid, le, ri, val, 2*nod); add(mid + 1, r, le, ri, val, 2*nod + 1); tree[nod] = tree[2*nod] + tree[2*nod + 1]; } } int query(int l, int r, int le, int ri, int nod){ push(l, r, nod); if(r < le || l > ri) return 0; else if(l >= le && r <= ri){ return tree[nod]; } else{ int mid = l + (r - l) / 2; return query(l, mid, le, ri, 2*nod) + query(mid + 1, r, le, ri, 2*nod + 1); } } void rec(int l, int r, vector<int>&pending){ if(r < l) return; int mid = l + (r - l) / 2; while(curr < mid){ curr++; if(x[curr] <= y[curr]) add(1, m, x[curr], y[curr], z[curr], 1); else{ add(1, m, x[curr], m, z[curr], 1); add(1, m, 1, y[curr], z[curr], 1); } } while(curr > mid){ if(x[curr] <= y[curr]) add(1, m, x[curr], y[curr], -z[curr], 1); else{ add(1, m, x[curr], m, -z[curr], 1); add(1, m, 1, y[curr], -z[curr], 1); } --curr; } vector<int>good; vector<int>bad; for(auto it : pending){ int curr = 0; for(auto it1 : members[it]){ curr += query(1, m, it1, it1, 1); } if(curr >= p[it]){ good.push_back(it); ans[it] = mid; } else{ bad.push_back(it); } } pending.clear(); if(l != r){ rec(l, mid - 1, good); rec(mid + 1, r, bad); } } int32_t main(){ //ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0); //freopen("input.in", "r", stdin); cin >> n >> m; for(int i=1;i<=m;i++){ cin >> a[i]; members[a[i]].push_back(i); } for(int i=1;i<=n;i++) cin >> p[i]; cin >> k; for(int i=1;i<=k;i++){ cin >> x[i] >> y[i] >> z[i]; } vector<int>tz; for(int i=1;i<=n;i++) tz.push_back(i); rec(1, k, tz); for(int i=1;i<=n;i++){ if(!ans[i]){ cout << "NIE" << '\n'; } else{ cout << ans[i] << '\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...