Submission #922517

#TimeUsernameProblemLanguageResultExecution timeMemory
922517vjudge1Meteors (POI11_met)C++17
74 / 100
3940 ms63080 KiB
#include <bits/stdc++.h> #define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) #define all(x) (x).begin(), (x).end() #define pb push_back #define sz(x) (int)x.size() #define F first #define S second #define ll long long //#define int long long const int dx[] = {0, 1, 0, -1, -1, 1, 1, -1}; const int dy[] = {1, 0, -1, 0, -1, 1, -1, 1}; const int maxn = 3e5+7; const int inf = 1e9; const int mod = 1e9+7; using namespace std; int n, m, k; int s[maxn], p[maxn]; int L[maxn], R[maxn], x[maxn]; ll t[maxn << 2], ps[maxn << 2]; vector <int> cur[maxn]; vector <int> have[maxn]; int res[maxn]; struct node{ int sl, sr; } seg[maxn]; void push(int tl, int tr, int v){ if(tl != tr){ ps[v << 1] += ps[v]; ps[v << 1 | 1] += ps[v]; } t[v] += ps[v]; ps[v] = 0; } void build(int tl = 1, int tr = m, int v = 1){ t[v] = ps[v] = 0; if(tl == tr) return; int md = (tl + tr) >> 1; build(tl, md, v << 1); build(md + 1, tr, v << 1 | 1); } void update(int l, int r, int val, int tl = 1, int tr = m, int v = 1){ push(tl, tr, v); if(l > tr || tl > r) return; else if(l <= tl && tr <= r){ ps[v] += val; push(tl, tr, v); }else{ int md = (tl + tr) >> 1; update(l, r, val, tl, md, v << 1); update(l, r, val, md + 1, tr, v << 1 | 1); } } int get(int pos, int tl = 1, int tr = m, int v = 1){ push(tl, tr, v); if(tl == tr){ return t[v]; }else{ int md = (tl + tr) >> 1; if(pos <= md) return get(pos, tl, md, v << 1); else return get(pos, md + 1, tr, v << 1 | 1); } } void solve(){ cin >> n >> m; for(int i = 1; i <= m; i++){ cin >> s[i]; cur[s[i]].pb(i); } for(int i = 1; i <= n; i++){ cin >> p[i]; } cin >> k; for(int i = 1; i <= k; i++){ cin >> L[i] >> R[i] >> x[i]; } for(int i = 1; i <= n; i++){ seg[i].sl = 1; seg[i].sr = k; } for(int rep = 1; rep <= 19; rep++){ build(); bool check = 1; for(int i = 1; i <= n; i++){ if(seg[i].sl <= seg[i].sr){ int md = (seg[i].sl + seg[i].sr) >> 1; have[md].pb(i); check = 0; } } if(check) break; for(int i = 1; i <= k; i++){ if(L[i] <= R[i]){ update(L[i], R[i], x[i]); }else{ update(L[i], m, x[i]); update(1, R[i], x[i]); } for(auto x : have[i]){ ll ans = 0; for(auto pos : cur[x]){ ans += get(pos); if(ans >= p[x]) break; } if(ans >= p[x]){ res[x] = i; seg[x].sr = i - 1; }else{ seg[x].sl = i + 1; } } have[i].clear(); } } for(int i = 1; i <= n; i++){ if(res[i] == 0){ cout << "NIE\n"; continue; } cout << res[i] << '\n'; } } signed main(){ speed int test = 1; // cin >> test; while(test--){ solve(); } }
#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...