#include<bits/stdc++.h>
#define MAXN 100007
using namespace std;
const int bucket_sz=200;
struct qr{
int l,r,id;
}qs[MAXN];
struct node{
int l,r;
}w[MAXN];
struct event{
int type,ind,val,tim;
};
stack<event> st;
int n,m,q,a,b,tt,dist[MAXN],bucket[MAXN],l,r,cnt[MAXN],tim,sum,last,ans[MAXN];
int c[MAXN],num[MAXN],ret[MAXN],fr[MAXN];
vector<int> v[MAXN],euler;
void dfs(int x,int p,int d){
tt++; num[x]=tt; ret[tt]=x;
dist[x]=d;
fr[x]=int(euler.size());
euler.push_back(num[x]);
for(int i=0;i<v[x].size();i++){
if(v[x][i]==p)continue;
dfs(v[x][i],x,d+1);
euler.push_back(num[x]);
}
}
bool li[4*MAXN][20];
int dp[4*MAXN][20];
int lg[4*MAXN],power[20];
void calc(){
power[0]=1;
for(int i=1;i<20;i++)power[i]=power[i-1]*2;
lg[1]=0;
for(int i=2;i<=4*n;i++)lg[i]=lg[i/2]+1;
}
int rmq(int i,int j){
if(j==0)return euler[i];
if(li[i][j])return dp[i][j];
li[i][j]=true;
dp[i][j]=min( rmq(i,j-1) , rmq(i+power[j-1],j-1) );
return dp[i][j];
}
int lca(int x,int y){
if(fr[x]>fr[y])swap(x,y);
x=fr[x]; y=fr[y];
return ret[ min( rmq(x,lg[y-x+1]) , rmq(y-power[lg[y-x+1]]+1,lg[y-x+1]) ) ];
}
int distance(int x,int y){
if(x==0 or y==n+1)return 0;
return dist[x]+dist[y]-2*dist[lca(x,y)];
}
bool cmp(qr fr,qr sc){
if(bucket[fr.l]!=bucket[sc.l])return bucket[fr.l]<bucket[sc.l];
return fr.r>sc.r;
}
void insertv(int x,int y,int z){
sum-=distance(ret[y],ret[z]);
sum+=distance(ret[y],ret[x]);
sum+=distance(ret[x],ret[z]);
w[x].l=y; w[x].r=z;
w[y].r=x; w[z].l=x;
}
void erasev(int x){
st.push({1,w[x].l,x,tim});
st.push({2,w[x].r,x,tim});
w[w[x].l].r=w[x].r;
w[w[x].r].l=w[x].l;
}
void rem(int x){
if(x==0){
tim++; return;
}
tim++;
x=num[c[x]];
cnt[x]--;
if(cnt[x]!=0)return;
st.push({3,0,sum,tim});
sum-=distance(ret[w[x].l],ret[x]);
sum-=distance(ret[x],ret[w[x].r]);
sum+=distance(ret[w[x].l],ret[w[x].r]);
erasev(x);
}
void undo(){
while(!st.empty() and st.top().tim==tim){
if(st.top().type==1){
w[st.top().ind].r=st.top().val;
}
if(st.top().type==2){
w[st.top().ind].l=st.top().val;
}
if(st.top().type==3){
sum=st.top().val;
}
st.pop();
}
tim--;
}
void reset(){
tim=sum=0;
while(!st.empty())st.pop();
for(int i=1;i<=n;i++)cnt[i]=0;
}
int edge(){
int lx=w[0].r,rx=w[n+1].l;
return distance(ret[lx],ret[rx]);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
calc();
for(int i=1;i<=n-1;i++){
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1,0,0);
w[0].l=n+1;
w[n+1].r=0;
ret[n+1]=n+1;
for(int i=1;i<=m;i++){
cin>>c[i];
bucket[i]=i/bucket_sz;
}
for(int i=1;i<=q;i++){
cin>>qs[i].l>>qs[i].r;
qs[i].id=i;
}
sort(qs+1,qs+q+1,cmp);
for(int i=1;i<=q;i++){
if(i==1 or bucket[qs[i].l]!=bucket[qs[i-1].l]){
reset();
for(int f=bucket[qs[i].l]*bucket_sz;f<=m;f++){
cnt[num[c[f]]]++;
}
last=0;
for(int f=1;f<=n;f++){
if(cnt[f]==0)continue;
insertv(f,last,n+1);
last=f;
}
l=bucket[qs[i].l]*bucket_sz;
r=m;
}
while(r>qs[i].r){
rem(r); r--;
}
while(l<qs[i].l){
rem(l); l++;
}
ans[qs[i].id]=(sum+edge())/2;
while(l>bucket[qs[i].l]*bucket_sz){
undo(); l--; cnt[num[c[l]]]++;
}
}
for(int i=1;i<=q;i++){
cout<<ans[i]+1<<"\n";
}
return 0;
}
Compilation message
tourism.cpp: In function 'void dfs(int, int, int)':
tourism.cpp:32:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
32 | for(int i=0;i<v[x].size();i++){
| ~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10588 KB |
Output is correct |
2 |
Correct |
1 ms |
10588 KB |
Output is correct |
3 |
Correct |
2 ms |
10584 KB |
Output is correct |
4 |
Correct |
2 ms |
10584 KB |
Output is correct |
5 |
Correct |
2 ms |
10588 KB |
Output is correct |
6 |
Correct |
3 ms |
10588 KB |
Output is correct |
7 |
Correct |
3 ms |
10748 KB |
Output is correct |
8 |
Correct |
2 ms |
10768 KB |
Output is correct |
9 |
Correct |
3 ms |
10588 KB |
Output is correct |
10 |
Correct |
3 ms |
10588 KB |
Output is correct |
11 |
Correct |
3 ms |
10588 KB |
Output is correct |
12 |
Correct |
2 ms |
10588 KB |
Output is correct |
13 |
Correct |
2 ms |
10676 KB |
Output is correct |
14 |
Correct |
2 ms |
10588 KB |
Output is correct |
15 |
Correct |
3 ms |
10588 KB |
Output is correct |
16 |
Correct |
3 ms |
10588 KB |
Output is correct |
17 |
Correct |
3 ms |
10784 KB |
Output is correct |
18 |
Correct |
4 ms |
10588 KB |
Output is correct |
19 |
Correct |
3 ms |
10584 KB |
Output is correct |
20 |
Correct |
3 ms |
10584 KB |
Output is correct |
21 |
Correct |
3 ms |
10588 KB |
Output is correct |
22 |
Correct |
4 ms |
10588 KB |
Output is correct |
23 |
Correct |
3 ms |
10588 KB |
Output is correct |
24 |
Correct |
3 ms |
10588 KB |
Output is correct |
25 |
Correct |
3 ms |
10588 KB |
Output is correct |
26 |
Correct |
3 ms |
10588 KB |
Output is correct |
27 |
Correct |
2 ms |
8540 KB |
Output is correct |
28 |
Correct |
2 ms |
8540 KB |
Output is correct |
29 |
Correct |
3 ms |
10584 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10588 KB |
Output is correct |
2 |
Correct |
1 ms |
10588 KB |
Output is correct |
3 |
Correct |
2 ms |
10584 KB |
Output is correct |
4 |
Correct |
2 ms |
10584 KB |
Output is correct |
5 |
Correct |
2 ms |
10588 KB |
Output is correct |
6 |
Correct |
3 ms |
10588 KB |
Output is correct |
7 |
Correct |
3 ms |
10748 KB |
Output is correct |
8 |
Correct |
2 ms |
10768 KB |
Output is correct |
9 |
Correct |
3 ms |
10588 KB |
Output is correct |
10 |
Correct |
3 ms |
10588 KB |
Output is correct |
11 |
Correct |
3 ms |
10588 KB |
Output is correct |
12 |
Correct |
2 ms |
10588 KB |
Output is correct |
13 |
Correct |
2 ms |
10676 KB |
Output is correct |
14 |
Correct |
2 ms |
10588 KB |
Output is correct |
15 |
Correct |
3 ms |
10588 KB |
Output is correct |
16 |
Correct |
3 ms |
10588 KB |
Output is correct |
17 |
Correct |
3 ms |
10784 KB |
Output is correct |
18 |
Correct |
4 ms |
10588 KB |
Output is correct |
19 |
Correct |
3 ms |
10584 KB |
Output is correct |
20 |
Correct |
3 ms |
10584 KB |
Output is correct |
21 |
Correct |
3 ms |
10588 KB |
Output is correct |
22 |
Correct |
4 ms |
10588 KB |
Output is correct |
23 |
Correct |
3 ms |
10588 KB |
Output is correct |
24 |
Correct |
3 ms |
10588 KB |
Output is correct |
25 |
Correct |
3 ms |
10588 KB |
Output is correct |
26 |
Correct |
3 ms |
10588 KB |
Output is correct |
27 |
Correct |
2 ms |
8540 KB |
Output is correct |
28 |
Correct |
2 ms |
8540 KB |
Output is correct |
29 |
Correct |
3 ms |
10584 KB |
Output is correct |
30 |
Correct |
11 ms |
10844 KB |
Output is correct |
31 |
Correct |
14 ms |
10844 KB |
Output is correct |
32 |
Correct |
18 ms |
10984 KB |
Output is correct |
33 |
Correct |
15 ms |
10844 KB |
Output is correct |
34 |
Correct |
16 ms |
10844 KB |
Output is correct |
35 |
Correct |
4 ms |
10844 KB |
Output is correct |
36 |
Correct |
6 ms |
10844 KB |
Output is correct |
37 |
Correct |
4 ms |
10844 KB |
Output is correct |
38 |
Correct |
16 ms |
10844 KB |
Output is correct |
39 |
Correct |
16 ms |
11316 KB |
Output is correct |
40 |
Correct |
15 ms |
11096 KB |
Output is correct |
41 |
Correct |
4 ms |
10844 KB |
Output is correct |
42 |
Correct |
4 ms |
11068 KB |
Output is correct |
43 |
Correct |
4 ms |
10844 KB |
Output is correct |
44 |
Correct |
16 ms |
10844 KB |
Output is correct |
45 |
Correct |
16 ms |
11012 KB |
Output is correct |
46 |
Correct |
16 ms |
10844 KB |
Output is correct |
47 |
Correct |
4 ms |
10968 KB |
Output is correct |
48 |
Correct |
4 ms |
10844 KB |
Output is correct |
49 |
Correct |
4 ms |
10844 KB |
Output is correct |
50 |
Correct |
18 ms |
10844 KB |
Output is correct |
51 |
Correct |
15 ms |
10844 KB |
Output is correct |
52 |
Correct |
15 ms |
10844 KB |
Output is correct |
53 |
Correct |
18 ms |
10996 KB |
Output is correct |
54 |
Correct |
16 ms |
10844 KB |
Output is correct |
55 |
Correct |
16 ms |
10844 KB |
Output is correct |
56 |
Correct |
4 ms |
8540 KB |
Output is correct |
57 |
Correct |
2 ms |
8796 KB |
Output is correct |
58 |
Correct |
19 ms |
10988 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10584 KB |
Output is correct |
2 |
Correct |
2 ms |
8800 KB |
Output is correct |
3 |
Correct |
4 ms |
8540 KB |
Output is correct |
4 |
Correct |
2379 ms |
25504 KB |
Output is correct |
5 |
Correct |
1910 ms |
30764 KB |
Output is correct |
6 |
Correct |
2771 ms |
34860 KB |
Output is correct |
7 |
Correct |
4177 ms |
36892 KB |
Output is correct |
8 |
Correct |
4350 ms |
36880 KB |
Output is correct |
9 |
Correct |
4126 ms |
36712 KB |
Output is correct |
10 |
Correct |
4866 ms |
36856 KB |
Output is correct |
11 |
Correct |
5000 ms |
36884 KB |
Output is correct |
12 |
Correct |
305 ms |
34204 KB |
Output is correct |
13 |
Correct |
290 ms |
34208 KB |
Output is correct |
14 |
Correct |
296 ms |
34204 KB |
Output is correct |
15 |
Correct |
58 ms |
23544 KB |
Output is correct |
16 |
Execution timed out |
5039 ms |
36680 KB |
Time limit exceeded |
17 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10588 KB |
Output is correct |
2 |
Correct |
1464 ms |
25124 KB |
Output is correct |
3 |
Correct |
3070 ms |
28144 KB |
Output is correct |
4 |
Correct |
2894 ms |
28628 KB |
Output is correct |
5 |
Correct |
57 ms |
35272 KB |
Output is correct |
6 |
Correct |
94 ms |
36804 KB |
Output is correct |
7 |
Correct |
201 ms |
37824 KB |
Output is correct |
8 |
Correct |
551 ms |
38176 KB |
Output is correct |
9 |
Correct |
1497 ms |
38316 KB |
Output is correct |
10 |
Correct |
4453 ms |
38472 KB |
Output is correct |
11 |
Execution timed out |
5015 ms |
38496 KB |
Time limit exceeded |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10588 KB |
Output is correct |
2 |
Correct |
2 ms |
8536 KB |
Output is correct |
3 |
Correct |
5 ms |
8540 KB |
Output is correct |
4 |
Correct |
3725 ms |
26932 KB |
Output is correct |
5 |
Correct |
3371 ms |
29112 KB |
Output is correct |
6 |
Correct |
4931 ms |
35912 KB |
Output is correct |
7 |
Execution timed out |
5052 ms |
39120 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10588 KB |
Output is correct |
2 |
Correct |
1 ms |
10588 KB |
Output is correct |
3 |
Correct |
2 ms |
10584 KB |
Output is correct |
4 |
Correct |
2 ms |
10584 KB |
Output is correct |
5 |
Correct |
2 ms |
10588 KB |
Output is correct |
6 |
Correct |
3 ms |
10588 KB |
Output is correct |
7 |
Correct |
3 ms |
10748 KB |
Output is correct |
8 |
Correct |
2 ms |
10768 KB |
Output is correct |
9 |
Correct |
3 ms |
10588 KB |
Output is correct |
10 |
Correct |
3 ms |
10588 KB |
Output is correct |
11 |
Correct |
3 ms |
10588 KB |
Output is correct |
12 |
Correct |
2 ms |
10588 KB |
Output is correct |
13 |
Correct |
2 ms |
10676 KB |
Output is correct |
14 |
Correct |
2 ms |
10588 KB |
Output is correct |
15 |
Correct |
3 ms |
10588 KB |
Output is correct |
16 |
Correct |
3 ms |
10588 KB |
Output is correct |
17 |
Correct |
3 ms |
10784 KB |
Output is correct |
18 |
Correct |
4 ms |
10588 KB |
Output is correct |
19 |
Correct |
3 ms |
10584 KB |
Output is correct |
20 |
Correct |
3 ms |
10584 KB |
Output is correct |
21 |
Correct |
3 ms |
10588 KB |
Output is correct |
22 |
Correct |
4 ms |
10588 KB |
Output is correct |
23 |
Correct |
3 ms |
10588 KB |
Output is correct |
24 |
Correct |
3 ms |
10588 KB |
Output is correct |
25 |
Correct |
3 ms |
10588 KB |
Output is correct |
26 |
Correct |
3 ms |
10588 KB |
Output is correct |
27 |
Correct |
2 ms |
8540 KB |
Output is correct |
28 |
Correct |
2 ms |
8540 KB |
Output is correct |
29 |
Correct |
3 ms |
10584 KB |
Output is correct |
30 |
Correct |
11 ms |
10844 KB |
Output is correct |
31 |
Correct |
14 ms |
10844 KB |
Output is correct |
32 |
Correct |
18 ms |
10984 KB |
Output is correct |
33 |
Correct |
15 ms |
10844 KB |
Output is correct |
34 |
Correct |
16 ms |
10844 KB |
Output is correct |
35 |
Correct |
4 ms |
10844 KB |
Output is correct |
36 |
Correct |
6 ms |
10844 KB |
Output is correct |
37 |
Correct |
4 ms |
10844 KB |
Output is correct |
38 |
Correct |
16 ms |
10844 KB |
Output is correct |
39 |
Correct |
16 ms |
11316 KB |
Output is correct |
40 |
Correct |
15 ms |
11096 KB |
Output is correct |
41 |
Correct |
4 ms |
10844 KB |
Output is correct |
42 |
Correct |
4 ms |
11068 KB |
Output is correct |
43 |
Correct |
4 ms |
10844 KB |
Output is correct |
44 |
Correct |
16 ms |
10844 KB |
Output is correct |
45 |
Correct |
16 ms |
11012 KB |
Output is correct |
46 |
Correct |
16 ms |
10844 KB |
Output is correct |
47 |
Correct |
4 ms |
10968 KB |
Output is correct |
48 |
Correct |
4 ms |
10844 KB |
Output is correct |
49 |
Correct |
4 ms |
10844 KB |
Output is correct |
50 |
Correct |
18 ms |
10844 KB |
Output is correct |
51 |
Correct |
15 ms |
10844 KB |
Output is correct |
52 |
Correct |
15 ms |
10844 KB |
Output is correct |
53 |
Correct |
18 ms |
10996 KB |
Output is correct |
54 |
Correct |
16 ms |
10844 KB |
Output is correct |
55 |
Correct |
16 ms |
10844 KB |
Output is correct |
56 |
Correct |
4 ms |
8540 KB |
Output is correct |
57 |
Correct |
2 ms |
8796 KB |
Output is correct |
58 |
Correct |
19 ms |
10988 KB |
Output is correct |
59 |
Correct |
2 ms |
10584 KB |
Output is correct |
60 |
Correct |
2 ms |
8800 KB |
Output is correct |
61 |
Correct |
4 ms |
8540 KB |
Output is correct |
62 |
Correct |
2379 ms |
25504 KB |
Output is correct |
63 |
Correct |
1910 ms |
30764 KB |
Output is correct |
64 |
Correct |
2771 ms |
34860 KB |
Output is correct |
65 |
Correct |
4177 ms |
36892 KB |
Output is correct |
66 |
Correct |
4350 ms |
36880 KB |
Output is correct |
67 |
Correct |
4126 ms |
36712 KB |
Output is correct |
68 |
Correct |
4866 ms |
36856 KB |
Output is correct |
69 |
Correct |
5000 ms |
36884 KB |
Output is correct |
70 |
Correct |
305 ms |
34204 KB |
Output is correct |
71 |
Correct |
290 ms |
34208 KB |
Output is correct |
72 |
Correct |
296 ms |
34204 KB |
Output is correct |
73 |
Correct |
58 ms |
23544 KB |
Output is correct |
74 |
Execution timed out |
5039 ms |
36680 KB |
Time limit exceeded |
75 |
Halted |
0 ms |
0 KB |
- |