Submission #954309

#TimeUsernameProblemLanguageResultExecution timeMemory
954309YassirSalamaTwo Currencies (JOI23_currencies)C++17
0 / 100
5067 ms24464 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; inline int64_t gilbertOrder(int x, int y, int pow, int rotate) { if (pow == 0) { return 0; } int hpow = 1 << (pow-1); int seg = (x < hpow) ? ( (y < hpow) ? 0 : 3 ) : ( (y < hpow) ? 1 : 2 ); seg = (seg + rotate) & 3; const int rotateDelta[4] = {3, 0, 0, 1}; int nx = x & (x ^ hpow), ny = y & (y ^ hpow); int nrot = (rotate + rotateDelta[seg]) & 3; int64_t subSquareSize = int64_t(1) << (2*pow - 2); int64_t ans = seg * subSquareSize; int64_t add = gilbertOrder(nx, ny, pow-1, nrot); ans += (seg == 1 || seg == 2) ? add : (subSquareSize - add - 1); return ans; } struct Query { int l, r, id,x,y; int64_t ord; inline void calcOrder() { ord = gilbertOrder(l, r, 21, 0); } }; inline bool operator<(const Query &a, const Query &b) { return a.ord < b.ord; } 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...