#include<iostream>
#include<stack>
#include<map>
#include<vector>
#include<string>
#include<unordered_map>
#include <queue>
#include<cstring>
#include<limits.h>
#include <cassert>
#include<cmath>
#include<set>
#include<algorithm>
#include <iomanip>
#include<numeric> //gcd(a,b)
#include<bitset>
#include <cstdlib>
#include <cstdint>
using namespace std;
#define ll long long
#define f first
//#define endl "\n"
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-loops")
using namespace std;
//#define int long long
//#define double long double
const int mod=1e9+7,mxn=2e5+5,lg=60,inf=1e9,minf=-1e9,mx=3e4;
int root=700,st;
vector<int>adj[mxn+10];
int re[mxn+10],recnt[mxn+10],sz[mxn+10],hvyp[mxn+10],up[mxn+10];
int tin[mxn+10],tout[mxn+10],T=0;
void getsz(int cur){sz[cur]=1;for(auto i:adj[cur])getsz(i),sz[cur]+=sz[i];}
void dfs(int cur,int hvypa){
tin[cur]=++T;
int hvy=0;
hvyp[cur]=hvypa;
for(auto i:adj[cur]){
if(sz[i]>sz[hvy])hvy=i;
up[i]=cur;
}
for(auto i:adj[cur])if(i!=hvy)dfs(i,i);
if(hvy)dfs(hvy,hvypa);
tout[cur]=T;
}
bool cmp(int a,int b){return tin[a]<tin[b];}
struct chain{
vector<int>have,com;
vector<vector<int>>pos;
void init(){
if(have.empty())return;
for(auto i:have)com.pb(re[i]);
sort(all(com));
sort(all(have),cmp);
com.erase(unique(all(com)),com.end());
pos.resize(com.size());
for(auto i:have)pos[lb(all(com),re[i])-com.begin()].pb(tin[i]);
return;
}
int get(int x,int id){
auto it=lb(all(com),id)-com.begin();
if(it>=pos.size()||com[it]!=id)return 0;
if(pos[it].empty())return 0;
if(pos[it].back()<=x)return pos[it].size();
else return upper_bound(all(pos[it]),x)-pos[it].begin();
}
}t[mxn+10];//parent of hvy chain
vector<int>pos[mxn+10];
vector<int>have[mxn+10];
int pre[mx][505];
int32_t main(){
fastio
int n,r,q;cin>>n>>r>>q;
root=500;
//root=sqrt(n);
for(int i=1;i<=n;i++){
if(i!=1){
int b;cin>>b;
adj[b].pb(i);
}
cin>>re[i];
recnt[re[i]]++;
have[re[i]].pb(i);
}
getsz(1);
dfs(1,1);
for(int i=1;i<=n;i++)t[hvyp[i]].have.pb(i);
for(int i=1;i<=n;i++)t[i].init(),pos[re[i]].pb(tin[i]);
vector<int>k;
for(int i=1;i<=r;i++){
if(recnt[i]<root)continue;
k.pb(i);
}
for(int i=1;i<=n;i++){
int cur=i;
while(hvyp[cur]!=1){
for(int j=0;j<k.size();j++){
pre[re[i]][j]+=t[hvyp[cur]].get(tin[cur],k[j]);
}
cur=up[hvyp[cur]];
}
for(int j=0;j<k.size();j++)pre[re[i]][j]+=t[hvyp[cur]].get(tin[cur],k[j]);
}
//qry r1,r2 cout<<pre[r2][pos r1];
while(q--){
int a,b;cin>>a>>b;
if(recnt[a]<root||1){
int ans=0;
for(auto j:have[a]){
int l=lb(all(pos[b]),tin[j])-pos[b].begin();
if(l==pos[b].size())continue;
int r=ub(all(pos[b]),tout[j])-pos[b].begin()-1;
ans+=(r-l+1);
}
cout<<ans<<endl;
}
else{
auto it=lb(all(k),a)-k.begin();
cout<<pre[b][it]<<endl;
}
}
}
/*
sqrt decomp
if region cnt<=sqrtn -> burte force sqrtn{
do euler tour keep vector of pos in euler tour for each region
when qry r1,r2 loop through all sqrtn node then qry in subtree of that node
qry-> bs l,r in vector of r2; ans+=(r-l+1)
}
else we precompute the region to other region (keep sqrtn(r)){
use merge sort tree +hld? (too costly?){
dont need merge sort?
keep chain then each chain keep vector of pos for each region
}
}
*/
Compilation message
regions.cpp: In member function 'int chain::get(int, int)':
regions.cpp:72:8: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
72 | if(it>=pos.size()||com[it]!=id)return 0;
| ~~^~~~~~~~~~~~
regions.cpp: In function 'int32_t main()':
regions.cpp:107:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
107 | for(int j=0;j<k.size();j++){
| ~^~~~~~~~~
regions.cpp:112:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
112 | for(int j=0;j<k.size();j++)pre[re[i]][j]+=t[hvyp[cur]].get(tin[cur],k[j]);
| ~^~~~~~~~~
regions.cpp:121:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
121 | if(l==pos[b].size())continue;
| ~^~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
35672 KB |
Output is correct |
2 |
Incorrect |
7 ms |
35672 KB |
Output isn't correct |
3 |
Incorrect |
9 ms |
35672 KB |
Output isn't correct |
4 |
Incorrect |
9 ms |
35724 KB |
Output isn't correct |
5 |
Incorrect |
12 ms |
35672 KB |
Output isn't correct |
6 |
Correct |
16 ms |
35672 KB |
Output is correct |
7 |
Incorrect |
22 ms |
35928 KB |
Output isn't correct |
8 |
Incorrect |
24 ms |
35928 KB |
Output isn't correct |
9 |
Correct |
34 ms |
36692 KB |
Output is correct |
10 |
Incorrect |
55 ms |
36784 KB |
Output isn't correct |
11 |
Incorrect |
86 ms |
37208 KB |
Output isn't correct |
12 |
Incorrect |
97 ms |
37464 KB |
Output isn't correct |
13 |
Incorrect |
133 ms |
38492 KB |
Output isn't correct |
14 |
Incorrect |
168 ms |
38908 KB |
Output isn't correct |
15 |
Correct |
221 ms |
40676 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
8090 ms |
44172 KB |
Time limit exceeded |
2 |
Execution timed out |
8074 ms |
46852 KB |
Time limit exceeded |
3 |
Execution timed out |
8089 ms |
45788 KB |
Time limit exceeded |
4 |
Incorrect |
174 ms |
39208 KB |
Output isn't correct |
5 |
Incorrect |
247 ms |
39748 KB |
Output isn't correct |
6 |
Incorrect |
766 ms |
56064 KB |
Output isn't correct |
7 |
Incorrect |
1093 ms |
43608 KB |
Output isn't correct |
8 |
Incorrect |
912 ms |
67792 KB |
Output isn't correct |
9 |
Incorrect |
1579 ms |
52048 KB |
Output isn't correct |
10 |
Incorrect |
2966 ms |
54492 KB |
Output isn't correct |
11 |
Incorrect |
2352 ms |
60820 KB |
Output isn't correct |
12 |
Incorrect |
3506 ms |
88068 KB |
Output isn't correct |
13 |
Incorrect |
3979 ms |
88484 KB |
Output isn't correct |
14 |
Incorrect |
5599 ms |
98472 KB |
Output isn't correct |
15 |
Incorrect |
6245 ms |
105580 KB |
Output isn't correct |
16 |
Incorrect |
4839 ms |
110124 KB |
Output isn't correct |
17 |
Incorrect |
7641 ms |
101024 KB |
Output isn't correct |