Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MX=5e5+6;
- int n,m,pa[MX],order[MX],cnt,Left[MX],Right[MX];
- vector<vector<int>> adj,Level;
- char bb[MX];
- struct Node
- {
- int ch[26];
- Node(){
- memset(ch,0,sizeof ch);
- }
- Node operator += (Node & b)
- {
- for(int i=0;i<26;i++)
- ch[i]+=b.ch[i];
- return *this;
- }
- };
- vector<vector<Node>> cum;
- void dfs(int x,int dis)
- {
- order[x]=++cnt;
- Left[x]=cnt;
- Node z;
- z.ch[bb[x]-'a']++;
- z+=cum[dis].back();
- cum[dis].push_back(z);
- Level[dis].push_back(x);
- // cout<<x<<' '<<dis<<endl;
- for(auto u : adj[x])
- dfs(u,dis+1);
- Right[x]=cnt;
- }
- int bisearch(int v,int h)
- {
- int st=0,en=(int)cum[h].size()-1,opt=1e9;
- while(st<=en)
- {
- int mid=(st+en)/2;
- if(order[Level[h][mid]]>=Left[v])
- {
- opt=min(opt,mid);
- en=mid-1;
- }else st=mid+1;
- }
- return opt;
- }
- int bisearch2(int v,int h)
- {
- int st=0,en=(int)cum[h].size()-1,opt=0;
- while(st<=en)
- {
- int mid=(st+en)/2;
- if(order[Level[h][mid]]<=Right[v])
- {
- opt=max(opt,mid);
- st=mid+1;
- }else en=mid-1;
- }
- return opt;
- }
- int main()
- {
- cin>>n>>m;
- adj.resize(n+4);
- Level.resize(n+4);
- cum.resize(n+4);
- for(int i=0;i<=n;i++)
- {
- Node x;
- cum[i].push_back(x);
- Level[i].push_back(0);
- }
- for(int i=2;i<=n;i++)
- {
- int a;
- scanf("%d",&a);
- pa[i]=a;
- adj[a].push_back(i);
- }
- scanf("%s",bb);
- dfs(1,1);
- // return 0;
- for(int i=1;i<=m;i++)
- {
- int v,h;
- scanf("%d%d",&v,&h);
- //cout<<Level[h].size()<<endl;
- //return 0;
- int st=bisearch(v,h)-1;
- int en=bisearch2(v,h);
- // cout<<st<<' '<<en<<endl;
- Node tmp;
- int odd=0;
- for(int j=0;j<26;j++)
- {
- tmp.ch[j]=-cum[h][st].ch[j]+cum[h][en].ch[j];
- odd+=tmp.ch[j]%2;
- cout<<tmp.ch[j]<<' ';
- }
- if(odd>1)puts("NO");
- else puts("YES");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement