Submission #954332

#TimeUsernameProblemLanguageResultExecution timeMemory
954332YassirSalamaTwo Currencies (JOI23_currencies)C++17
0 / 100
5045 ms35468 KiB
#include <bits/stdc++.h> using namespace std; const int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1}; #define OVL(x,s) for(auto y:x) cout<<y<<s; cout<<"\n"; #ifdef IOI void dbg_out() { cout << endl; } template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cout << ' ' << H; dbg_out(T...); } #define dbg(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__); #else #define dbg(...) 1337; #endif #define endl "\n" #define pb push_back #define F first #define S second #define ll long long #define mod 1000000007 #define all(v) v.begin(),v.end() #define int long long #pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt") const int MAXN=1e5+100; const int BQ=316; constexpr int logn = 20; constexpr int maxn = 1 << logn; uint64_t hilbertorder(uint64_t x, uint64_t y) { const uint64_t logn = __lg(max(x, y) * 2 + 1) | 1; const uint64_t maxn = (1ull << logn) - 1; uint64_t res = 0; for (uint64_t s = 1ull << (logn - 1); s; s >>= 1) { bool rx = x & s, ry = y & s; res = (res << 2) | (rx ? ry ? 2 : 1 : ry ? 3 : 0); if (!rx) { if (ry) x ^= maxn, y ^= maxn; swap(x, y); } } return res; } struct Query { int l, r, id,x,y; int64_t ord; inline void calcOrder() { ord = hilbertorder(l, r); } }; inline bool operator<(const Query &a, const Query &b) { if(a.l / BQ != b.l / BQ) return a.l < b.l; return (a.l / BQ )% 2 ? a.r < b.r : a.r > b.r; } vector<int> c[MAXN]; vector<Query> queries; unordered_map<int,int> f,g; set<int> cc; int arr[BQ+10]; int arr2[MAXN]; int cnt=0; int cnt1[BQ+10]; void add(int x){ cnt++; arr[f[x]/BQ+1]+=x; cnt1[f[x]/BQ+1]++; arr2[f[x]]++; } void remove(int x){ cnt--; arr[f[x]/BQ+1]-=x; cnt1[f[x]/BQ+1]--; arr2[f[x]]--; } vector<pair<int,int>> v[MAXN]; void a(int a,int b){ int x=-1; for(auto y:v[a]){ if(y.F==b){ x=y.S; break; } } if(x==-1) return; for(auto y:c[x]){ add(y); } } void re(int a,int b){ int x=-1; for(auto y:v[a]){ if(y.F==b){ x=y.S; break; } } if(x==-1) return; for(auto y:c[x]) remove(y); } const int MOD = 1e9 + 7; const int BUF_SZ = 1 << 15; inline namespace Input { char buf[BUF_SZ]; int pos; int len; char next_char() { if (pos == len) { pos = 0; len = (int)fread(buf, 1, BUF_SZ, stdin); if (!len) { return EOF; } } return buf[pos++]; } int read_int() { int x; char ch; int sgn = 1; while (!isdigit(ch = next_char())) { if (ch == '-') { sgn *= -1; } } x = ch - '0'; while (isdigit(ch = next_char())) { x = x * 10 + (ch - '0'); } return x * sgn; } } int ans[MAXN]; signed main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); int n,m,q; // cin>>n>>m>>q; n=read_int(); m=read_int(); q=read_int(); for(int i=1;i<n;i++){ int a,b; a=read_int(); b=read_int(); // cin>>a>>b; v[a].pb({b,i}); v[b].pb({a,i}); } for(int i=0;i<m;i++){ int t; t=read_int(); // cin>>t; int d; d=read_int(); // cin>>d; cc.insert(d); c[t].pb(d); } int comp=1; for(auto x:cc){ f[x]=comp; g[comp]=x; comp++; } for(int i=0;i<q;i++){ int l,r,x,y; // cin>>l>>r>>x>>y; l=read_int(); r=read_int(); x=read_int(); y=read_int(); if(l>r) swap(l,r); queries.pb({.l=l,.r=r,.id=i,.x=x,.y=y}); } sort(all(queries)); int l=0; int r=0; for(int i=0;i<q;i++){ int ql=queries[i].l; int qr=queries[i].r; int id=queries[i].id; int x=queries[i].x; int y=queries[i].y; while(r<qr){ a(r,r+1); r++; } while(l>ql){ a(l,l-1); l--; } while(l<ql){ re(l,l+1); l++; } while(r>qr){ re(r,r-1); r--; } int t=0; int k=cnt; for(int i=1;i<=BQ;i++){ if(y>=arr[i]){ y-=arr[i]; t=i; k-=cnt1[i]; }else break; } for(int i=BQ*(t);i<BQ*(t+1);i++){ if(!g.count(i)) continue; int c=arr2[i]; int x=g[i]; k-=min((y/x),c); y-=min(y/x,c)*x; } if(x>=k){ ans[id]=x-k; }else ans[id]=-1; } for(int i=0;i<q;i++) 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...