#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <climits>
#include <cmath>
#include <complex>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <vector>
#include <stack>
using namespace std;
#define int long long
#define mp make_pair
#define fi first
#define pii pair<int,int>
#define se second
const int INF=1000000000000000000;
//const int INF=1e9;
const int N=1000000;
//const int M=998244353;
const int ln=20;
template<typename T>
std::ostream& operator<< (std::ostream& os,pair<T,T> p){
return os << p.fi << "," << p.se << " ";
}
vector<int> edges[N];
int parent[N];
int depth[N];
int lpos[N];
int rpos[N];
vector<int> et;
vector<int> det;
void dfs(int u,int p){
parent[u]=p;
lpos[u]=rpos[u]=et.size();
et.push_back(u);
det.push_back(depth[u]);
for(int v:edges[u]){
if(v==p) continue;
depth[v]=depth[u]+1;
dfs(v,u);
rpos[u]=et.size();
et.push_back(u);
det.push_back(depth[u]);
}
}
int sq=300;
int pow2[N];
void solve(){
int n,m,q;
cin >> n >> m >> q;
for(int i=0;i<n-1;i++){
int u,v;
cin >> u >> v;
u--,v--;
edges[u].push_back(v);
edges[v].push_back(u);
}
depth[0]=0;
dfs(0,-1);
int c[m];
for(int i=0;i<m;i++){
cin >> c[i];
c[i]--;
}
pair<pii,int> queries[q];
for(int i=0;i<q;i++){
int l,r;
cin >> l >> r;
l--;
queries[i]=mp(mp(l,r),i);
}
sort(queries,queries+q,[&](pair<pii,int> p1,pair<pii,int> p2){
return mp(p1.fi.fi/sq,(2*((p1.fi.fi/sq)%2)-1)*p1.fi.se)<mp(p2.fi.fi/sq,(2*((p2.fi.fi/sq)%2)-1)*p2.fi.se);
});
int sptb[2*n-1][ln];
for(int i=0;i<2*n-1;i++) sptb[i][0]=det[i];
for(int j=0;j<ln-1;j++){
for(int i=0;i<2*n-1;i++){
if(i+(1<<j)>=2*n-1){
sptb[i][j+1]=sptb[i][j];
} else sptb[i][j+1]=min(sptb[i][j],sptb[i+(1<<j)][j]);
}
}
auto lca=[&](int u,int v){
int l=min(lpos[u],lpos[v]);
int r=max(lpos[u],lpos[v])+1;
int sz=pow2[r-l];
int o1=sptb[l][sz];
int o2=sptb[r-(1<<sz)][sz];
return min(o1,o2);
};
int cl=0;
int cr=0;
int cans=0;
int ans[q];
//for(int i:et) cout << i << " ";
//cout << "\n";
multiset<int> lposes;
for(int i=0;i<q;i++){
int l=queries[i].fi.fi;
int r=queries[i].fi.se;
int ind=queries[i].se;
auto inc=[&](int ci)->void{
//cout << ci << ">?\n";
auto it=lposes.insert(lpos[c[ci]]);
auto nit=next(it,1);
cans+=depth[c[ci]];
if(it==lposes.begin() && nit==lposes.end()){
return;
}
if(it==lposes.begin() && nit!=lposes.end()){
cans-=lca(c[ci],et[*nit]);
return;
}
auto pit=next(it,-1);
if(nit==lposes.end()){
cans-=lca(c[ci],et[*pit]);
return;
}
cans+=lca(et[*pit],et[*nit]);
cans-=lca(c[ci],et[*pit]);
cans-=lca(c[ci],et[*nit]);
};
auto rem=[&](int ci)->void{
auto it=lposes.find(lpos[c[ci]]);
auto nit=next(it,1);
cans-=depth[c[ci]];
if(it==lposes.begin() && nit==lposes.end()){
lposes.erase(it);
return;
}
if(it==lposes.begin() && nit!=lposes.end()){
cans+=lca(c[ci],et[*nit]);
lposes.erase(it);
return;
}
auto pit=next(it,-1);
if(nit==lposes.end()){
cans+=lca(c[ci],et[*pit]);
lposes.erase(it);
return;
}
cans-=lca(et[*pit],et[*nit]);
cans+=lca(c[ci],et[*pit]);
cans+=lca(c[ci],et[*nit]);
lposes.erase(it);
};
while(cr<r){
inc(cr);
cr++;
}
while(cl>l){
cl--;
inc(cl);
}
while(cl<l){
rem(cl);
cl++;
}
while(cr>r){
cr--;
rem(cr);
}
ans[ind]=cans-lca(et[*lposes.begin()],et[*lposes.rbegin()]);
}
for(int i=0;i<q;i++) cout << ans[i]+1 << "\n";
}
signed main(){
auto begin = std::chrono::high_resolution_clock::now();
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
pow2[1]=0;
for(int i=2;i<N;i++){
if(i==(1<<(pow2[i-1]+1))) pow2[i]=pow2[i-1]+1;
else pow2[i]=pow2[i-1];
}
int t;
//cin >> t;
t=1;
while(t--) solve();
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
}
# | 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... |