/*
Ben Watson
Quang Minh MasterDDDDD
*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const string name = "test";
void solve();
signed main()
{
if (fopen((name + ".inp").c_str(), "r"))
{
freopen((name + ".inp").c_str(), "r", stdin);
freopen((name + ".out").c_str(), "w", stdout);
}
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
solve();
return 0;
}
// main program
const int oo = 0x3f3f3f3f;
const int maxn = 1e5 + 1;
struct FenwickTree
{
vector<int> bits;
int n;
FenwickTree(int n) : n(n) { bits.resize(n + 1, 0); }
void update(int pos, int val)
{
for (; pos <= n; pos += (pos & (-pos)))
bits[pos] += val;
}
int query(int pos)
{
int res = 0;
for (; pos > 0; pos -= (pos & (-pos)))
res += bits[pos];
return res;
}
int query(int l, int r) { return query(r) - query(l - 1); }
};
vector<int> adj[maxn], queries[maxn];
int c[maxn], ans[maxn], L[maxn];
FenwickTree bit(maxn);
int n, m, q;
// tree processing
int pos[maxn], tp[maxn], sz[maxn], par[maxn], d[maxn];
void DFS(int u, int p = -1)
{
sz[u] = 1;
for (int v : adj[u])
{
if (v == p)
continue;
par[v] = u;
d[v] = d[u] + 1;
DFS(v, u);
sz[u] += sz[v];
}
}
int timeDFS = 0;
void DFS_HLD(int u, int top)
{
pos[u] = ++timeDFS;
tp[u] = top;
int nxt = -1;
for (int v : adj[u])
if (v != par[u] && (nxt == -1 || sz[v] > sz[nxt]))
nxt = v;
if (nxt != -1)
DFS_HLD(nxt, top);
for (int v : adj[u])
if (v != par[u] && v != nxt)
DFS_HLD(v, v);
}
// handle queries
int R[maxn], X[maxn];
set<int> se;
void update(int l, int r, int x)
{
// cout << l << ' ' << r << ' ' << x << '\n' << '\n';
// cout << "Before update:\n";
// for (array<int, 3> it : se)
// cout << it[0] << ' ' << it[1] << ' ' << it[2] << '\n';
// cout << "\n";
// cout << "During update:\n";
vector<int> pending, deleted;
auto it = se.upper_bound(r);
while (it != se.begin())
{
it--;
int u = (*it), v = R[u], val = X[u];
// cout << u << ' ' <<v << ' ' << val << '\n';
if (v < l)
break;
deleted.push_back(u);
int le = max(u, l), ri = min(v, r);
bit.update(val + 1, -(ri - le + 1));
R[le] = ri; X[le] = x;
pending.push_back(le);
if (u < l)
{
R[u] = l - 1; X[u] = val;
pending.push_back(u);
}
if (r < v)
{
R[r + 1] = v; X[r + 1] = val;
pending.push_back(r + 1);
}
}
// cout << "Finished\n";
for (int it : deleted)
se.erase(it);
bit.update(x + 1, r - l + 1);
for (int it : pending)
se.insert(it);
// cout << "After update:\n";
// for (auto it : se)
// cout << it[0] << ' ' << it[1] << ' ' << it[2] << '\n';
// cout << "Count occurrences:\n";
// for (int i = 0; i <= n; i++)
// cout << i << " : " << bit.query(i + 1, i + 1) << '\n';
// cout << "END\n"; cout << '\n' << '\n' << '\n';
}
void update_path(int u, int v, int x)
{
while (tp[u] != tp[v])
{
if (d[tp[u]] < d[tp[v]])
swap(u, v);
update(pos[tp[u]], pos[u], x);
u = par[tp[u]];
}
if (d[u] > d[v])
swap(u, v);
update(pos[u], pos[v], x);
}
void solve()
{
cin >> n >> m >> q;
for (int i = 1; i < n; i++)
{
int u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int i = 1; i <= m; i++)
cin >> c[i];
DFS(1);
DFS_HLD(1, 1);
bit.update(1, n);
se.insert(1);
R[1] = n;
for (int i = 1; i <= q; i++)
{
int l, r; cin >> l >> r;
L[i] = l;
queries[r].push_back(i);
}
for (int i = 1; i <= m; i++)
{
if (i != 1)
update_path(c[i - 1], c[i], i - 1);
update_path(c[i], c[i], i);
for (int idx : queries[i])
ans[idx] = bit.query(L[idx] + 1, m + 1);
}
for (int i = 1; i <= q; i++)
cout << ans[i] << '\n';
}
Compilation message (stderr)
tourism.cpp: In function 'int main()':
tourism.cpp:19:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
19 | freopen((name + ".inp").c_str(), "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tourism.cpp:20:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
20 | freopen((name + ".out").c_str(), "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |