Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*dsu on tree */
- int n,big[MAX];vi v[MAX];char c[MAX];
- int ans[MAX];int vis[MAX];vector<pii>ques[MAX];
- int Sz[MAX],col[MAX][30];int cnt,maxi;vi v2;char str[MAX];
- void dfs2(int s,int p){
- Sz[s] = 1;
- for(auto it : v[s]){
- if(it==p)continue;
- dfs2(it,s);
- Sz[s]+=Sz[it];
- }
- }
- void add(int s,int p,int val,int depth){
- col[depth][c[s]-96]+=val;
- for(auto it : v[s]){
- if(p==it||big[it])continue;
- add(it,s,val,depth+1);
- }
- }
- void dfs(int s,int p,int keep,int depth){
- int b = -1,mx = -1;
- for(auto it : v[s]){
- if(Sz[it]>mx&&it!=p){
- mx = Sz[it];
- b = it;
- }
- }
- for(auto it : v[s]){
- if(it!=b&&it!=p)dfs(it,s,0,depth+1);
- }
- if(b!=-1)dfs(b,s,1,depth+1),big[b] = 1;
- add(s,p,1,depth);
- for(auto it : ques[s]){
- int jor = 0,bijor = 0;
- for(char ch = 'a';ch<='z';ch++){
- if(col[it.ff][ch-96]&1)bijor++;
- else jor++;
- }
- if(bijor<=1)ans[it.ss] = 1;
- else ans[it.ss] = 0;
- }
- //cout<<s<<" balsal "<<maxi<<endl;
- if(b!=-1)big[b] = 0;
- if(!keep)add(s,p,-1,depth),cnt=0,maxi=0;
- }
- int main()
- {
- // booster()
- ///read("input.txt");
- scani(n);
- int q;
- scani(q);
- string st;
- for(int i = 0;i<n-1;i++){
- int a;
- scani(a);
- v[a].pb(i+2);
- }
- scanf(" %s",str);
- st = str;
- for(int i = 0;i<n;i++)c[i+1] = st[i];
- for(int i = 0;i<q;i++){
- int a,b;
- scani2(a,b);
- ques[a].pb(pii(b,i+1));
- }
- dfs2(1,0);
- dfs(1,0,1,1);
- for(int i = 1;i<=q;i++){
- if(ans[i])puts("Yes");
- else puts("No");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement