제출 #1091302

#제출 시각아이디문제언어결과실행 시간메모리
1091302asli_bgRegions (IOI09_regions)C++11
30 / 100
8098 ms105692 KiB
#pragma GCC optimize ("O3,unroll-loops")
 
#include<bits/stdc++.h>
using namespace std;
 
#define int long long

#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pb push_back
 
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<bool> vb;
typedef priority_queue<int> pq;
 
#define sp <<' '<<
#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)
 
#define cont(x) {for(auto el:x) cout<<el<<' ';cout<<endl;}
#define contp(x) {for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;}
#define DEBUG(X) { cout << #X << " = " << (X) << endl; }
 
#define carp(x,y,mod) (((x)%mod)*((y)%mod))%mod
#define topla(x,y,mod) (((x)%mod)+((y)%mod))%mod
 
#define mid (l+r)/2
//#define endl '\n'
 
const int MAXN=2e5+5;
const int MAXK=30;

int n,q,r;
vi adj[MAXN];
vi euler;
int sub[MAXN],ind[MAXN],dep[MAXN];
int p[MAXN];
vi t[4*MAXN];
vi reg[MAXN];
int home[MAXN];

void dfs(int nd,int ata,int h){
    dep[nd]=h;
    sub[nd]=1;
    euler.pb(nd);
    for(auto kom:adj[nd]){
        if(kom!=ata){
            dfs(kom,nd,h+1);
            sub[nd]+=sub[kom];
        }
    }
}

vi merge(vi& a,vi& b){
    vi c;
    int sz1=a.size();
    int sz2=b.size();
    int p1,p2;
    p1=p2=0;
    while(p1<sz1 or p2<sz2){
        if(p2>=sz2 or (p1<sz1 and a[p1]<=b[p2])){
            c.pb(a[p1++]);
        }
        else c.pb(b[p2++]);
    }
    return c;
}

void build(int nd=1,int l=1,int r=n){
    if(l==r){
        t[nd].pb(home[euler[l]]);
        return;
    }
    build(nd*2,l,mid);
    build(nd*2+1,mid+1,r);
    t[nd]=merge(t[nd*2],t[nd*2+1]);
}

int query(int ql,int qr,int vv,int nd=1,int l=1,int r=n){
    if(l>r or l>qr or r<ql) return 0;
    if(ql<=l and r<=qr){
        auto bir=lower_bound(all(t[nd]),vv);
        auto iki=upper_bound(all(t[nd]),vv);
        return iki-bir;
    }
    auto s1=query(ql,qr,vv,nd*2,l,mid);
    auto s2=query(ql,qr,vv,nd*2+1,mid+1,r);
    return s1+s2;
}


signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    euler.pb(0);
    cin>>n>>r>>q;
    cin>>home[1];
    reg[home[1]].pb(1);
    FORE(i,2,n+1){
        cin>>p[i]>>home[i];
        reg[home[i]].pb(i);
        adj[p[i]].pb(i);
        adj[i].pb(p[i]);
    }

    dfs(1,0,0);
    FORE(i,1,n+1){
        ind[euler[i]]=i;
    }
    build();

    while(q--){
        int a,b;
        cin>>a>>b;
        int cev=0;
        for(auto el:reg[a]){
            cev+=query(ind[el],ind[el]+sub[el]-1,b);
        }
        cout<<cev<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...