Submission #889665

#TimeUsernameProblemLanguageResultExecution timeMemory
889665AiperiiiTourism (JOI23_tourism)C++14
5 / 100
5097 ms12956 KiB
#include <bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define ff first
#define ss second
#define pb push_back
using namespace std;
const int N=1e5+5;
int mn[N*4],mx[N*4],c[N];
void build(int v,int tl,int tr){
    if(tl==tr){
        mn[v]=c[tl];
        mx[v]=c[tl];
    }
    else{
        int tm=(tl+tr)/2;
        build(v*2,tl,tm);
        build(v*2+1,tm+1,tr);
        mn[v]=min(mn[v*2],mn[v*2+1]);
        mx[v]=max(mx[v*2],mx[v*2+1]);
    }
}
int get_mn(int v,int tl,int tr,int l,int r){
    if(r<tl or l>tr)return INT_MAX;
    if(l<=tl && tr<=r)return mn[v];
    int tm=(tl+tr)/2;
    return min(get_mn(v*2,tl,tm,l,r),get_mn(v*2+1,tm+1,tr,l,r));
}
int get_mx(int v,int tl,int tr,int l,int r){
    if(r<tl or l>tr)return INT_MIN;
    if(l<=tl && tr<=r)return mx[v];
    int tm=(tl+tr)/2;
    return max(get_mx(v*2,tl,tm,l,r),get_mx(v*2+1,tm+1,tr,l,r));
}
signed main(){
    ios_base::sync_with_stdio();
    cin.tie(0);
    int n,m,qq;
    cin>>n>>m>>qq;
    vector <int> g[n+1];
    for(int i=0;i<n-1;i++){
        int u,v;
        cin>>u>>v;
        g[u].pb(v);
        g[v].pb(u);
    }
    for(int i=1;i<=m;i++){
        cin>>c[i];
    }
    if(n<=300){
        queue <int> q;
        while(qq--){
            int l,r;
            cin>>l>>r;
            set <int> st;
            if(l==r)st.insert(l);
            for(int i=l;i<r;i++){
                vector <int> d(n+1,-1);
                vector <int> p(n+1);
                q.push(c[i]);
                d[c[i]]=1;
                while(!q.empty()){
                    int v=q.front();
                    q.pop();
                    for(auto to : g[v]){
                        if(d[to]==-1){
                            d[to]=1;
                            p[to]=v;
                            q.push(to);
                        }
                    }
                }
                int x=c[i+1];
                st.insert(x);st.insert(c[i]);
                while(x!=c[i]){
                    x=p[x];
                    st.insert(x);
                }
            }
            cout<<st.size()<<"\n";
        }
        return 0;
    }
    build(1,1,m);
    while(qq--){
        int l,r;
        cin>>l>>r;
        cout<<get_mx(1,1,m,l,r)-get_mn(1,1,m,l,r)+1<<"\n";
    }
}
#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...