This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
#define int long long
using namespace std;
struct BIT{
int n;
vector<int> bt;
void init(int x){
n=x;
bt.resize(n+1);
}
void update(int x,int y){
x++;
for(;x<=n;x+=(x&-x)){
bt[x]+=y;
}
}
int query(int x){
int ans=0;
x++;
for(;x>0;x-=(x&-x)){
ans+=bt[x];
}
return ans;
}
int sum(int l,int r){
return query(r)-(l==0?0:query(l-1));
}
}bt;
struct SZT{
vector<vector<int> > dg;
void init(vector<int>& x){
int f=x.size();
int r=__lg(f)+1;
dg.resize(r,vector<int>(f));
dg[0]=x;
for(int i=1;i<r;i++){
for(int j=0;j+(1<<(i))-1<f;j++){
dg[i][j]=min(dg[i-1][j],dg[i-1][j+(1<<(i-1))]);
}
}
}
int query(int l,int r){
int t=__lg(r-l+1);
return min(dg[t][l],dg[t][r-(1<<(t))+1]);
}
}pd,lin,lout;
struct ST{
vector<int> st;
void init(int x){
st.resize(4*x);
}
void update(int v,int L,int R,int p,int x){
if(L==R){
st[v]=x;
return;
}
int m=(L+R)/2;
if(p<=m){
update(2*v+1,L,m,p,x);
}
else{
update(2*v+2,m+1,R,p,x);
}
st[v]=max(st[2*v+1],st[2*v+2]);
}
int query(int v,int L,int R,int l,int r){
if(L==l && r==R){
return st[v];
}
int m=(L+R)/2;
if(r<=m){
return query(2*v+1,L,m,l,r);
}
else if(l>m){
return query(2*v+2,m+1,R,l,r);
}
else{
return max(query(2*v+1,L,m,l,m),query(2*v+2,m+1,R,m+1,r));
}
}
}po;
struct no{
vector<int> ch;
int dep=-1;
int fa=-1;
int vis=0;
int in=-1,out=-1;
};
vector<no> v;
vector<int> z;
int cnt=0;
void dfs(int r,int f){
v[r].fa=f;
v[r].dep=v[f].dep+1;
v[r].in=cnt;
z.push_back(v[r].dep);
cnt++;
for(auto h:v[r].ch){
if(h!=f){
dfs(h,r);
z.push_back(v[r].dep);
cnt++;
}
}
v[r].out=cnt-1;
}
int lca(int l,int r){
int a=lin.query(l,r);
int b=-lout.query(l,r);
return pd.query(a,b);
}
signed main(){
AquA;
int n,m,q;
cin >> n >> m >> q;
v.resize(n);
vector<int> c(n+1);
c[0]=0;
for(int i=1;i<n;i++){
int a,b;
cin >> a >> b;
a--;
b--;
v[a].ch.push_back(b);
v[b].ch.push_back(a);
}
dfs(0,0);
pd.init(z);
int g=z.size();
vector<int> ii,oo;
vector<int> w(m);
for(int i=0;i<m;i++){
int a;
cin >> a;
a--;
w[i]=a;
ii.push_back(v[a].in);
oo.push_back(-v[a].out);
}
lin.init(ii);
lout.init(oo);
vector<vector<pair<int,int> > > vq(m);
vector<int> ans(q);
for(int i=0;i<q;i++){
int a,b;
cin >> a >> b;
a--;
b--;
vq[b].push_back({i,a});
}
po.init(g);
bt.init(m);
vector<int> co(m);
for(int i=0;i<m;i++){
bt.update(i,v[w[i]].dep);
int x=w[i];
while(!v[x].vis){
v[x].vis=1;
if(x==0){
break;
}
x=v[x].fa;
}
while(x!=0){
int s=po.query(0,0,g-1,v[x].in,v[x].out);
int z=co[s];
bt.update(s,v[co[s]].dep-v[x].dep);
co[s]=x;
x=z;
}
co[i]=0;
po.update(0,0,g-1,v[w[i]].in,i);
for(auto [h,l]:vq[i]){
ans[h]=bt.sum(l,i)-lca(l,i)+1;
}
}
for(int i=0;i<q;i++){
cout << ans[i] << "\n";
}
return 0;
}
Compilation message (stderr)
tourism.cpp: In function 'int main()':
tourism.cpp:179:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
179 | for(auto [h,l]:vq[i]){
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |