제출 #548562

#제출 시각아이디문제언어결과실행 시간메모리
5485622fat2code새로운 문제 (POI11_met)C++17
100 / 100
915 ms39288 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], p[nmax], x[nmax], y[nmax], z[nmax], ans[nmax], curr, tree[nmax]; vector<int>members[nmax]; void add(int pos, int val){ for(int i=pos;i<nmax;i+=(i&-i)){ tree[i] += val; } } int query(int pos){ int ans = 0; for(int i=pos;i>=1;i-=(i&-i)){ ans += tree[i]; } return ans; } 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(x[curr], z[curr]); add(y[curr]+1, (-1LL)*z[curr]); } else{ add(x[curr], z[curr]); add(m+1, (-1LL)*z[curr]); add(1, z[curr]); add(y[curr]+1, (-1LL)*z[curr]); } } while(curr > mid){ int fuck = z[curr] * (-1LL); if(x[curr] <= y[curr]){ add(x[curr], fuck); add(y[curr]+1, (-1LL)*fuck); } else{ add(x[curr], fuck); add(m+1, (-1LL)*fuck); add(1, fuck); add(y[curr]+1, (-1LL)*fuck); } --curr; } vector<int>good; vector<int>bad; for(auto it : pending){ int curr = 0; for(auto it1 : members[it]){ curr += (query(it1)); if(curr >= p[it]) break; } 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]; assert(1 <= x[i] && x[i] <= m); assert(1 <= y[i] && y[i] <= m); } 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...