#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i,s,e) for(int i = s; i <= (int)e; ++i)
#define DEC(i,s,e) for(int i = s; i >= (int)e; --i)
#define IAMSPEED ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef LOCAL
#define db(x) cerr << #x << "=" << x << "\n"
#define db2(x, y) cerr << #x << "=" << x << " , " << #y << "=" << y << "\n"
#define db3(a,b,c) cerr<<#a<<"="<<a<<","<<#b<<"="<<b<<","<<#c<<"="<<c<<"\n"
#define dbv(v) cerr << #v << ":"; for (auto ite : v) cerr << ite << ' '; cerr <<"\n"
#define dbvp(v) cerr << #v << ":"; for (auto ite : v) cerr << "{" << ite.f << ',' << ite.s << "} "; cerr << "\n"
#define dba(a,ss,ee) cerr << #a << ":"; FOR(ite,ss,ee) cerr << a[ite] << ' '; cerr << "\n"
#define reach cerr << "LINE: " << __LINE__ << "\n";
#else
#define reach
#define db(x)
#define db2(x,y)
#define db3(a,b,c)
#define dbv(v)
#define dbvp(v)
#define dba(a,ss,ee)
#endif
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define f first
#define s second
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define g3(x) get<3>(x)
typedef pair <int, int> pi;
typedef tuple<int,int,int> ti3;
typedef tuple<int,int,int,int> ti4;
int rand(int a, int b) { return a + rng() % (b-a+1); }
const int MOD = 1e9 + 7;
const int inf = (int)1e9 + 500;
const long long oo = (long long)1e18 + 500;
template <typename T> void chmax(T& a, const T b) { a=max(a,b); }
template <typename T> void chmin(T& a, const T b) { a=min(a,b); }
const int MAXN = 1000005;
int n,m,q;
vector<int>V[MAXN];
vector<pi> adj[MAXN];
int P[MAXN];
int head[MAXN];
int heavy[MAXN];
int pos[MAXN];
int parent[MAXN];
int depth[MAXN];
int sz[MAXN];
int cnt=1;
vector<int> W[MAXN];
int dfs(int x, int p){
sz[x]=1;
parent[x]=p;
int mx=0;
for(auto v:adj[x])if(v.f!=p){
depth[v.f]=depth[x]+1;
int res=dfs(v.f,x);
W[v.f]=V[v.s];
if(res>mx){
mx=res;
heavy[x]=v.f;
}
sz[x]+=res;
}
return sz[x];
}
void decompose(int x, int h) {
pos[x]=cnt++;
head[x]=h;
if(heavy[x]!=-1)decompose(heavy[x],h);
for(auto v:adj[x]){
if(v.f==parent[x]||v.f==heavy[x])continue;
decompose(v.f,v.f);
}
}
struct node {
node *l=nullptr,*r=nullptr;
int sum;
int num;
int s,e,m;
node(int _s, int _e, int val,int numval) {
s=_s;e=_e;
m=(s+e)/2;
sum=val;
num=numval;
return;
}
node(int _s, int _e, node *L, node *R) {
s=_s;e=_e;m=(s+e)/2;
l=L;
r=R;
sum=0;
num=0;
if(l)sum+=l->sum;
if(r)sum+=r->sum;
if(l)num+=l->num;
if(r)num+=r->num;
}
} *roots[MAXN];
node* build(int tl, int tr){
if(tl==tr){
return new node(tl,tr,(int)0,(int)0);
}
int tm=(tl+tr)/2;
return new node(tl,tr,build(tl,tm), build(tm+1,tr));
}
node* update(node *v, int tl, int tr, int pos, int nval) {
if(tl==tr){
return new node(tl,tr,v->sum+nval,v->num+1);
}
int tm=(tl+tr)/2;
if(pos<=tm){
return new node(tl,tr,update(v->l,tl,tm,pos,nval),v->r);
} else{
return new node(tl,tr,v->l,update(v->r,tm+1,tr,pos,nval));
}
}
pi E[MAXN];
map<int,int> D;
map<int,int> R;
void discretize(vector<int> vec){
vector<int> dis=vec;
sort(all(dis));
dis.resize(unique(all(dis))-dis.begin());
FOR(i,0,vec.size()-1){
D[vec[i]]=lower_bound(all(dis),vec[i])-dis.begin()+1;
R[lower_bound(all(dis),vec[i])-dis.begin()+1]=vec[i];
}
}
vector<pair<node*,node*>> nodes;
void ask(int x, int y) {
for(;head[x]!=head[y];y=parent[head[y]]){
if(depth[head[x]]>depth[head[y]])swap(x,y);
nodes.pb({roots[pos[head[y]]-1],roots[pos[y]]});
}
if(x==y)return;
if(depth[x]>depth[y])swap(x,y);
nodes.pb({roots[pos[x]],roots[pos[y]]});
}
int32_t main()
{
IAMSPEED
memset(heavy,-1,sizeof heavy);
cin >> n >> m >> q;
FOR(i,1,n-1){
cin >> E[i].f >> E[i].s;
}
vector<int> disc;
FOR(i,1,m){
int x; cin >> x;
int cost; cin>>cost;
disc.pb(cost);
V[x].pb(cost);
}
discretize(disc);
FOR(i,1,n-1){
adj[E[i].f].pb({E[i].s,i}); // this is the edge index
adj[E[i].s].pb({E[i].f,i}); // this is the edge index
}
dfs(1,-1);
decompose(1,1);
vector<pi> vec;
FOR(i,2,n){
vec.pb({pos[i],i});
}
sort(all(vec));
roots[1]=build(0,m+5);
for(auto x:vec) {
roots[x.f]=roots[x.f-1];
//db(x.s);
//dbv(W[x.s]);
for(auto cost:W[x.s]){
roots[x.f]=update(roots[x.f],0,m+5,D[cost],cost);
}
}
while(q--){
nodes.clear();
int s,t,x,y; cin >> s >> t >> x >> y;
ask(s,t);
for(auto &x:nodes){
node* lf=x.f;
node* rg=x.s;
}
vector<pair<node*,node*>> V=nodes;
bool done=0;
int res=0;
int val=0;
int num=0;
int S,E;
while(!done){
int lfsum=0;
int lfnum=0;
for(auto &x:nodes){
node* lf=x.f;
node* rg=x.s;
S=lf->s;
E=lf->e;
if(lf->s==lf->e){
done=1;
res=lf->s;
break;
}
lfsum+=rg->l->sum - lf->l->sum;
lfnum+=rg->l->num - lf->l->num;
}
if(val+lfsum<=y){
val+=lfsum;
num+=lfnum;
for(auto &x:nodes){
x.f=x.f->r;
x.s=x.s->r;
}
} else {
for(auto &x:nodes){
x.f=x.f->l;
x.s=x.s->l;
}
}
}
//
// it ended at res. hence, we might be able to get some of res+1 also.
--res;
int extra=0;
if(R[res+1])extra=(y-val)/R[res+1];
int ss=num+extra;
int tot = 0;
for(auto &x:V){
node* lf=x.f;
node* rg=x.s;
tot+=rg->num-lf->num;
}
int spend=tot-ss;
assert(spend>=0);
if(spend>x){
cout<<-1<<'\n';
} else{
cout<<x-spend<<'\n';
}
}
}
Compilation message
currencies.cpp: In function 'int32_t main()':
currencies.cpp:192:10: warning: unused variable 'lf' [-Wunused-variable]
192 | node* lf=x.f;
| ^~
currencies.cpp:193:10: warning: unused variable 'rg' [-Wunused-variable]
193 | node* rg=x.s;
| ^~
currencies.cpp:200:7: warning: variable 'S' set but not used [-Wunused-but-set-variable]
200 | int S,E;
| ^
currencies.cpp:200:9: warning: variable 'E' set but not used [-Wunused-but-set-variable]
200 | int S,E;
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
49 ms |
78572 KB |
Output is correct |
2 |
Correct |
39 ms |
78648 KB |
Output is correct |
3 |
Correct |
37 ms |
78540 KB |
Output is correct |
4 |
Correct |
37 ms |
78524 KB |
Output is correct |
5 |
Correct |
44 ms |
80748 KB |
Output is correct |
6 |
Correct |
46 ms |
80808 KB |
Output is correct |
7 |
Correct |
42 ms |
80284 KB |
Output is correct |
8 |
Correct |
47 ms |
81024 KB |
Output is correct |
9 |
Correct |
45 ms |
80972 KB |
Output is correct |
10 |
Correct |
45 ms |
80988 KB |
Output is correct |
11 |
Correct |
44 ms |
81012 KB |
Output is correct |
12 |
Correct |
44 ms |
81096 KB |
Output is correct |
13 |
Correct |
45 ms |
81284 KB |
Output is correct |
14 |
Correct |
45 ms |
81160 KB |
Output is correct |
15 |
Correct |
44 ms |
81064 KB |
Output is correct |
16 |
Correct |
45 ms |
81148 KB |
Output is correct |
17 |
Correct |
47 ms |
81116 KB |
Output is correct |
18 |
Correct |
47 ms |
81096 KB |
Output is correct |
19 |
Correct |
45 ms |
81036 KB |
Output is correct |
20 |
Correct |
42 ms |
81076 KB |
Output is correct |
21 |
Correct |
44 ms |
80980 KB |
Output is correct |
22 |
Correct |
45 ms |
81068 KB |
Output is correct |
23 |
Correct |
48 ms |
81080 KB |
Output is correct |
24 |
Correct |
53 ms |
80992 KB |
Output is correct |
25 |
Correct |
44 ms |
81064 KB |
Output is correct |
26 |
Correct |
46 ms |
81084 KB |
Output is correct |
27 |
Correct |
48 ms |
81016 KB |
Output is correct |
28 |
Correct |
49 ms |
81060 KB |
Output is correct |
29 |
Correct |
47 ms |
81100 KB |
Output is correct |
30 |
Correct |
45 ms |
80732 KB |
Output is correct |
31 |
Correct |
47 ms |
80840 KB |
Output is correct |
32 |
Correct |
46 ms |
80740 KB |
Output is correct |
33 |
Correct |
49 ms |
81288 KB |
Output is correct |
34 |
Correct |
49 ms |
81312 KB |
Output is correct |
35 |
Correct |
44 ms |
81252 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
78656 KB |
Output is correct |
2 |
Correct |
43 ms |
80756 KB |
Output is correct |
3 |
Correct |
42 ms |
80716 KB |
Output is correct |
4 |
Correct |
41 ms |
80732 KB |
Output is correct |
5 |
Correct |
397 ms |
208764 KB |
Output is correct |
6 |
Correct |
405 ms |
194516 KB |
Output is correct |
7 |
Correct |
403 ms |
175456 KB |
Output is correct |
8 |
Correct |
355 ms |
167964 KB |
Output is correct |
9 |
Correct |
365 ms |
178796 KB |
Output is correct |
10 |
Correct |
497 ms |
221948 KB |
Output is correct |
11 |
Correct |
530 ms |
222148 KB |
Output is correct |
12 |
Correct |
535 ms |
221980 KB |
Output is correct |
13 |
Correct |
475 ms |
222020 KB |
Output is correct |
14 |
Correct |
521 ms |
222000 KB |
Output is correct |
15 |
Correct |
396 ms |
233464 KB |
Output is correct |
16 |
Correct |
383 ms |
234204 KB |
Output is correct |
17 |
Correct |
418 ms |
233036 KB |
Output is correct |
18 |
Correct |
405 ms |
222276 KB |
Output is correct |
19 |
Correct |
419 ms |
222072 KB |
Output is correct |
20 |
Correct |
436 ms |
222224 KB |
Output is correct |
21 |
Correct |
353 ms |
221468 KB |
Output is correct |
22 |
Correct |
326 ms |
221552 KB |
Output is correct |
23 |
Correct |
345 ms |
221552 KB |
Output is correct |
24 |
Correct |
356 ms |
221640 KB |
Output is correct |
25 |
Correct |
438 ms |
221212 KB |
Output is correct |
26 |
Correct |
468 ms |
221312 KB |
Output is correct |
27 |
Correct |
456 ms |
221368 KB |
Output is correct |
28 |
Correct |
336 ms |
222048 KB |
Output is correct |
29 |
Correct |
332 ms |
221980 KB |
Output is correct |
30 |
Correct |
382 ms |
222036 KB |
Output is correct |
31 |
Correct |
358 ms |
221960 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
39 ms |
78548 KB |
Output is correct |
2 |
Correct |
44 ms |
81152 KB |
Output is correct |
3 |
Correct |
45 ms |
81184 KB |
Output is correct |
4 |
Correct |
53 ms |
81148 KB |
Output is correct |
5 |
Correct |
485 ms |
191748 KB |
Output is correct |
6 |
Correct |
444 ms |
171816 KB |
Output is correct |
7 |
Correct |
691 ms |
224704 KB |
Output is correct |
8 |
Correct |
904 ms |
250552 KB |
Output is correct |
9 |
Correct |
930 ms |
250644 KB |
Output is correct |
10 |
Correct |
983 ms |
250608 KB |
Output is correct |
11 |
Correct |
920 ms |
249808 KB |
Output is correct |
12 |
Correct |
925 ms |
249748 KB |
Output is correct |
13 |
Correct |
1029 ms |
249712 KB |
Output is correct |
14 |
Correct |
809 ms |
250440 KB |
Output is correct |
15 |
Correct |
894 ms |
250364 KB |
Output is correct |
16 |
Correct |
767 ms |
250720 KB |
Output is correct |
17 |
Correct |
924 ms |
250576 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
49 ms |
78572 KB |
Output is correct |
2 |
Correct |
39 ms |
78648 KB |
Output is correct |
3 |
Correct |
37 ms |
78540 KB |
Output is correct |
4 |
Correct |
37 ms |
78524 KB |
Output is correct |
5 |
Correct |
44 ms |
80748 KB |
Output is correct |
6 |
Correct |
46 ms |
80808 KB |
Output is correct |
7 |
Correct |
42 ms |
80284 KB |
Output is correct |
8 |
Correct |
47 ms |
81024 KB |
Output is correct |
9 |
Correct |
45 ms |
80972 KB |
Output is correct |
10 |
Correct |
45 ms |
80988 KB |
Output is correct |
11 |
Correct |
44 ms |
81012 KB |
Output is correct |
12 |
Correct |
44 ms |
81096 KB |
Output is correct |
13 |
Correct |
45 ms |
81284 KB |
Output is correct |
14 |
Correct |
45 ms |
81160 KB |
Output is correct |
15 |
Correct |
44 ms |
81064 KB |
Output is correct |
16 |
Correct |
45 ms |
81148 KB |
Output is correct |
17 |
Correct |
47 ms |
81116 KB |
Output is correct |
18 |
Correct |
47 ms |
81096 KB |
Output is correct |
19 |
Correct |
45 ms |
81036 KB |
Output is correct |
20 |
Correct |
42 ms |
81076 KB |
Output is correct |
21 |
Correct |
44 ms |
80980 KB |
Output is correct |
22 |
Correct |
45 ms |
81068 KB |
Output is correct |
23 |
Correct |
48 ms |
81080 KB |
Output is correct |
24 |
Correct |
53 ms |
80992 KB |
Output is correct |
25 |
Correct |
44 ms |
81064 KB |
Output is correct |
26 |
Correct |
46 ms |
81084 KB |
Output is correct |
27 |
Correct |
48 ms |
81016 KB |
Output is correct |
28 |
Correct |
49 ms |
81060 KB |
Output is correct |
29 |
Correct |
47 ms |
81100 KB |
Output is correct |
30 |
Correct |
45 ms |
80732 KB |
Output is correct |
31 |
Correct |
47 ms |
80840 KB |
Output is correct |
32 |
Correct |
46 ms |
80740 KB |
Output is correct |
33 |
Correct |
49 ms |
81288 KB |
Output is correct |
34 |
Correct |
49 ms |
81312 KB |
Output is correct |
35 |
Correct |
44 ms |
81252 KB |
Output is correct |
36 |
Correct |
41 ms |
78656 KB |
Output is correct |
37 |
Correct |
43 ms |
80756 KB |
Output is correct |
38 |
Correct |
42 ms |
80716 KB |
Output is correct |
39 |
Correct |
41 ms |
80732 KB |
Output is correct |
40 |
Correct |
397 ms |
208764 KB |
Output is correct |
41 |
Correct |
405 ms |
194516 KB |
Output is correct |
42 |
Correct |
403 ms |
175456 KB |
Output is correct |
43 |
Correct |
355 ms |
167964 KB |
Output is correct |
44 |
Correct |
365 ms |
178796 KB |
Output is correct |
45 |
Correct |
497 ms |
221948 KB |
Output is correct |
46 |
Correct |
530 ms |
222148 KB |
Output is correct |
47 |
Correct |
535 ms |
221980 KB |
Output is correct |
48 |
Correct |
475 ms |
222020 KB |
Output is correct |
49 |
Correct |
521 ms |
222000 KB |
Output is correct |
50 |
Correct |
396 ms |
233464 KB |
Output is correct |
51 |
Correct |
383 ms |
234204 KB |
Output is correct |
52 |
Correct |
418 ms |
233036 KB |
Output is correct |
53 |
Correct |
405 ms |
222276 KB |
Output is correct |
54 |
Correct |
419 ms |
222072 KB |
Output is correct |
55 |
Correct |
436 ms |
222224 KB |
Output is correct |
56 |
Correct |
353 ms |
221468 KB |
Output is correct |
57 |
Correct |
326 ms |
221552 KB |
Output is correct |
58 |
Correct |
345 ms |
221552 KB |
Output is correct |
59 |
Correct |
356 ms |
221640 KB |
Output is correct |
60 |
Correct |
438 ms |
221212 KB |
Output is correct |
61 |
Correct |
468 ms |
221312 KB |
Output is correct |
62 |
Correct |
456 ms |
221368 KB |
Output is correct |
63 |
Correct |
336 ms |
222048 KB |
Output is correct |
64 |
Correct |
332 ms |
221980 KB |
Output is correct |
65 |
Correct |
382 ms |
222036 KB |
Output is correct |
66 |
Correct |
358 ms |
221960 KB |
Output is correct |
67 |
Correct |
39 ms |
78548 KB |
Output is correct |
68 |
Correct |
44 ms |
81152 KB |
Output is correct |
69 |
Correct |
45 ms |
81184 KB |
Output is correct |
70 |
Correct |
53 ms |
81148 KB |
Output is correct |
71 |
Correct |
485 ms |
191748 KB |
Output is correct |
72 |
Correct |
444 ms |
171816 KB |
Output is correct |
73 |
Correct |
691 ms |
224704 KB |
Output is correct |
74 |
Correct |
904 ms |
250552 KB |
Output is correct |
75 |
Correct |
930 ms |
250644 KB |
Output is correct |
76 |
Correct |
983 ms |
250608 KB |
Output is correct |
77 |
Correct |
920 ms |
249808 KB |
Output is correct |
78 |
Correct |
925 ms |
249748 KB |
Output is correct |
79 |
Correct |
1029 ms |
249712 KB |
Output is correct |
80 |
Correct |
809 ms |
250440 KB |
Output is correct |
81 |
Correct |
894 ms |
250364 KB |
Output is correct |
82 |
Correct |
767 ms |
250720 KB |
Output is correct |
83 |
Correct |
924 ms |
250576 KB |
Output is correct |
84 |
Correct |
995 ms |
224636 KB |
Output is correct |
85 |
Correct |
865 ms |
207536 KB |
Output is correct |
86 |
Correct |
681 ms |
169060 KB |
Output is correct |
87 |
Correct |
1180 ms |
237740 KB |
Output is correct |
88 |
Correct |
1166 ms |
237152 KB |
Output is correct |
89 |
Correct |
1082 ms |
237792 KB |
Output is correct |
90 |
Correct |
1049 ms |
237756 KB |
Output is correct |
91 |
Correct |
1065 ms |
237756 KB |
Output is correct |
92 |
Correct |
960 ms |
246188 KB |
Output is correct |
93 |
Correct |
883 ms |
249032 KB |
Output is correct |
94 |
Correct |
1057 ms |
238368 KB |
Output is correct |
95 |
Correct |
1028 ms |
238224 KB |
Output is correct |
96 |
Correct |
1089 ms |
238272 KB |
Output is correct |
97 |
Correct |
1060 ms |
238252 KB |
Output is correct |
98 |
Correct |
799 ms |
236900 KB |
Output is correct |
99 |
Correct |
850 ms |
236700 KB |
Output is correct |
100 |
Correct |
824 ms |
236480 KB |
Output is correct |
101 |
Correct |
770 ms |
236816 KB |
Output is correct |
102 |
Correct |
1010 ms |
237328 KB |
Output is correct |
103 |
Correct |
989 ms |
237228 KB |
Output is correct |
104 |
Correct |
981 ms |
237276 KB |
Output is correct |
105 |
Correct |
664 ms |
237936 KB |
Output is correct |
106 |
Correct |
682 ms |
237404 KB |
Output is correct |
107 |
Correct |
672 ms |
237688 KB |
Output is correct |
108 |
Correct |
739 ms |
237620 KB |
Output is correct |