Submission #1306472

#TimeUsernameProblemLanguageResultExecution timeMemory
1306472Hamed_GhaffariTourism (JOI23_tourism)C++20
100 / 100
273 ms27956 KiB
#include <bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;

#define X first
#define Y second

const int MXN = 1e5+5;

int m, fen[MXN];
inline void updx(int p, int x) {
    for(++p; p<=m+1; p+=p&-p) fen[p] += x;
}
inline int getx(int p) {
    int res=0;
    for(++p; p; p-=p&-p) res += fen[p];
    return res;
}

int n, sz[MXN], par[MXN];
vector<int> g[MXN];

void dfs(int v) {
    sz[v] = 1;
    for(int u : g[v]) if(u!=par[v])
        par[u] = v,
        dfs(u),
        sz[v] += sz[u];
}

int stt[MXN], timer, hd[MXN];
set<pii> st[MXN];

void dfs2(int v) {
    stt[v] = timer++;
    if(!hd[v]) {
        hd[v] = v;
        st[v].insert({stt[v], 0});
    }
    int big = 0;
    for(int u : g[v])
        if(u!=par[v] && (!big || sz[u]>sz[big]))
            big = u;
    if(!big) {
        st[hd[v]].insert({stt[v]+1, 0});
        return;
    }
    hd[big] = hd[v];
    dfs2(big);
    for(int u : g[v])
        if(u!=par[v] && u!=big)
            dfs2(u);
}
inline void upd_chain(int i, int l, int r, int x) {
    auto it = st[i].lower_bound(pii(l, 0));
    if(it->X>l) {
        if(it->X>r+1) {
            updx(prev(it)->Y, -(r-l+1));
            updx(x, r-l+1);
            st[i].insert({r+1, prev(it)->Y});
            st[i].insert({l, x});
            return;
        }
        updx(prev(it)->Y, l-it->X);
    }
    while(it->X<=r) {
        pii pp = *it;
        it = st[i].erase(it);
        if(it->X>r+1) {
            updx(pp.Y, pp.X-(r+1));
            st[i].insert(pii(r+1, pp.Y));
            break;
        }
        updx(pp.Y, pp.X-it->X);
    }
    updx(x, r-l+1);
    st[i].insert({l, x});
}
inline void upd(int u, int v, int x) {
    while(hd[u]!=hd[v]) {
        if(stt[u]<stt[v]) swap(u, v);
        upd_chain(hd[u], stt[hd[u]], stt[u], x);
        u = par[hd[u]];
    }
    upd_chain(hd[u], min(stt[u], stt[v]), max(stt[u], stt[v]), x);
}

int q, c[MXN], ans[MXN];
vector<pii> Q[MXN];

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> m >> q;
    for(int i=1,u,v; i<n; i++) {
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1);
    dfs2(1);
    updx(0, n);
    for(int i=1; i<=m; i++) cin >> c[i];
    for(int i=1, l,r; i<=q; i++) {
        cin >> l >> r;
        if(l==r) ans[i] = 1;
        else Q[r].push_back({l, i});
    }
    for(int i=1; i<=m; i++) {
        if(i>1) upd(c[i], c[i-1], i-1);
        for(auto [l, id] : Q[i])
            ans[id] = n-getx(l-1);
    }
    for(int i=1; i<=q; i++)
        cout << ans[i] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...