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 <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define endl '\n'
const int MAXN=1e5+10;
const int BUCK=450;
struct Query {
int l, r;
int ind;
bool friend operator < (Query a, Query b) {
return a.r>b.r;
}
};
Query que[MAXN];
vector <int> v[MAXN];
vector <int> arr, isl;
int c[MAXN];
int fe[MAXN], le[MAXN], in[MAXN], dep[MAXN], ind[MAXN];
int sp[MAXN][20], stepen[MAXN];
int n, m, q, cnt;
bool cmpi(int a, int b) {
return in[a]<in[b];
}
void dfs(int x, int p) {
in[x]=cnt;
cnt++;
fe[x]=arr.size();
for (auto i:v[x]) {
if (i==p) continue;
ind[arr.size()]=x;
arr.push_back(x);
dep[i]=dep[x]+1;
dfs(i,x);
}
le[x]=arr.size();
ind[arr.size()]=x;
arr.push_back(x);
}
void sparce_table() {
int kn=arr.size();
for (int i=0;i<kn;i++) sp[i][0]=arr[i];
for (int i=1;(1<<i)<=kn;i++) {
for (int j=0;j+(1<<i)-1<kn;j++) {
int i1, i2;
i1=sp[j][i-1];
i2=sp[j + (1 << (i-1))][i-1];
if (dep[i1]<dep[i2]) sp[j][i]=i1;
else sp[j][i]=i2;
}
}
int st=0;
for (int i=1;i<=kn;i++) {
if ((1 << (st+1))<i) st++;
stepen[i]=st;
}
}
int lca(int l, int r) {
int st=stepen[r-l+1];
int i1, i2;
i1=sp[l][st];
i2=sp[r - (1<<st)+1][st];
if (dep[i1]<dep[i2]) return i1;
return i2;
}
int getdist(int a, int b) {
if (in[a]>in[b]) swap(a,b);
return dep[a]+dep[b]-2*dep[lca(fe[a],fe[b])];
}
int main () {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a, b;
cin >> n >> m >> q;
for (int i=0;i<n-1;i++) {
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
cnt=1;
dfs(1,-1);
sparce_table();
for (int i=1;i<=m;i++) cin >> c[i];
int ans;
for (int i=0;i<q;i++) {
cin >> que[i].l >> que[i].r;
if (!isl.empty()) isl.clear();
for (int j=que[i].l;j<=que[i].r;j++) isl.push_back(c[j]);
sort(isl.begin(),isl.end(),cmpi);
ans=0;
for (int j=1;j<isl.size();j++) ans+=getdist(isl[j-1],isl[j]);
if (isl.size()>1) ans+=getdist(isl[0],isl.back());
cout << ans/2+1 << endl;
que[i].ind=i;
}
return 0;
}
Compilation message (stderr)
tourism.cpp: In function 'int main()':
tourism.cpp:91:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
91 | for (int j=1;j<isl.size();j++) ans+=getdist(isl[j-1],isl[j]);
| ~^~~~~~~~~~~
# | 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... |