Advertisement
jeff69

Untitled

Mar 18th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int MX=5e5+6;
  5. int n,m,pa[MX],order[MX],cnt,Left[MX],Right[MX];
  6. vector<vector<int>> adj,Level;
  7. char bb[MX];
  8. struct Node
  9. {
  10. int ch[26];
  11. Node(){
  12. memset(ch,0,sizeof ch);
  13. }
  14. Node operator += (Node & b)
  15. {
  16.  
  17. for(int i=0;i<26;i++)
  18. ch[i]+=b.ch[i];
  19. return *this;
  20. }
  21. };
  22. vector<vector<Node>> cum;
  23. void dfs(int x,int dis)
  24. {
  25. order[x]=++cnt;
  26. Left[x]=cnt;
  27. Node z;
  28. z.ch[bb[x]-'a']++;
  29. z+=cum[dis].back();
  30. cum[dis].push_back(z);
  31. Level[dis].push_back(x);
  32. // cout<<x<<' '<<dis<<endl;
  33. for(auto u : adj[x])
  34. dfs(u,dis+1);
  35. Right[x]=cnt;
  36. }
  37. int bisearch(int v,int h)
  38. {
  39. int st=0,en=(int)cum[h].size()-1,opt=1e9;
  40. while(st<=en)
  41. {
  42. int mid=(st+en)/2;
  43. if(order[Level[h][mid]]>=Left[v])
  44. {
  45. opt=min(opt,mid);
  46. en=mid-1;
  47. }else st=mid+1;
  48. }
  49. return opt;
  50. }
  51. int bisearch2(int v,int h)
  52. {
  53. int st=0,en=(int)cum[h].size()-1,opt=0;
  54. while(st<=en)
  55. {
  56. int mid=(st+en)/2;
  57. if(order[Level[h][mid]]<=Right[v])
  58. {
  59. opt=max(opt,mid);
  60. st=mid+1;
  61. }else en=mid-1;
  62. }
  63. return opt;
  64. }
  65. int main()
  66. {
  67. cin>>n>>m;
  68. adj.resize(n+4);
  69. Level.resize(n+4);
  70. cum.resize(n+4);
  71. for(int i=0;i<=n;i++)
  72. {
  73. Node x;
  74. cum[i].push_back(x);
  75. Level[i].push_back(0);
  76. }
  77. for(int i=2;i<=n;i++)
  78. {
  79. int a;
  80. scanf("%d",&a);
  81. pa[i]=a;
  82. adj[a].push_back(i);
  83. }
  84. scanf("%s",bb);
  85. dfs(1,1);
  86. // return 0;
  87. for(int i=1;i<=m;i++)
  88. {
  89. int v,h;
  90. scanf("%d%d",&v,&h);
  91. //cout<<Level[h].size()<<endl;
  92. //return 0;
  93. int st=bisearch(v,h)-1;
  94. int en=bisearch2(v,h);
  95. // cout<<st<<' '<<en<<endl;
  96. Node tmp;
  97. int odd=0;
  98. for(int j=0;j<26;j++)
  99. {
  100. tmp.ch[j]=-cum[h][st].ch[j]+cum[h][en].ch[j];
  101. odd+=tmp.ch[j]%2;
  102. cout<<tmp.ch[j]<<' ';
  103. }
  104. if(odd>1)puts("NO");
  105. else puts("YES");
  106. }
  107. return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement