Submission #956322

#TimeUsernameProblemLanguageResultExecution timeMemory
956322LudisseyTwo Currencies (JOI23_currencies)C++14
0 / 100
8 ms860 KiB
#include <bits/stdc++.h> #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() const int LOG=20; using namespace std; struct FenwickTree { vector<int> bit; vector<int> bitc; int n; FenwickTree(int _n) { this->n = _n; bit.assign(_n,0); bitc.assign(_n,0); } int sum(int r){ int ret=0; for ( ; r>=0; r=(r&(r+1))-1) ret+=bit[r]; return ret; } int count0(int r){ int ret=0; for ( ; r>=0; r=(r&(r+1))-1) ret+=bitc[r]; return ret; } int count0(int l, int r){ return count0(r) - count0(l - 1); } void change(int idx, int val){ for (; idx < n; idx = (idx | (idx + 1))) { bit[idx] += val; bitc[idx]++; } } }; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,m,q; cin >> n >> m >> q; vector<vector<pair<int,int>>> sum(n); vector<pair<int,int>> v; vector<int> ed; for (int i = 0; i < n-1; i++) { int a,b; cin >> a >> b; ed.push_back(min(a-1,b-1)); } for (int i = 0; i < m; i++){ int p,c; cin >> p >> c; v.push_back({c,ed[p-1]}); } sort(v.begin(),v.end()); for (int i = 0; i < m; i++){ sum[v[i].second].push_back({v[i].first,i}); } int square=sqrt(n); vector<vector<pair<pair<pair<int,int>,pair<int,int>>,int>>> queries((n/square)+1); vector<int> ans(q); for (int Q = 0; Q < q; Q++) { int s,t,x,y; cin >> s >> t >> x >> y; if(s>t) swap(s,t); cerr<<s << "\n"; queries[(s/square)].push_back({{{t-1, s-1},{x,y}},Q}); } for (int i = 0; i < sz(queries); i++) sort(all(queries[i])); for (int i = 0; i < sz(queries); i++){ int l=-1,r=-1; FenwickTree tree(n); for (int j = 0; j < sz(queries[i]); j++){ int s=queries[i][j].first.first.second,t=queries[i][j].first.first.first,x=queries[i][j].first.second.first,y=queries[i][j].first.second.second,qr=queries[i][j].second; for (int k = max(s,r); k < t; k++) { for (auto u : sum[k]) { tree.change(u.second, u.first); } } for (int k = l; k < s && j>0; k++) { for (auto u : sum[k]) { tree.change(u.second, 0); } } l=s; r=t; int bl=0,br=n-1; int as=-1; while(bl<=br){ int mid=(bl+br)/2; int sm=tree.sum(mid); if(sm>y) { br=mid-1; }else{ as=mid; bl=mid+1; } } int c=tree.count0(as+1, n-1); ans[qr]=max(-1LL, x-c); } } for (int i = 0; i < sz(ans); i++) cout << ans[i] << "\n"; 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...