fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. int t;
  6. cin >> t;
  7. while(t--){
  8. int n,k;
  9. cin >> n >> k;
  10. int a[n];
  11. int x;
  12. int c[n+1];
  13. for(int i=0;i<n;i++){
  14. cin >> a[i];
  15. c[i+1] = a[i];
  16. if(i == 0){
  17. x = a[i];
  18. }
  19. else{
  20. x = x ^ a[i];
  21. }
  22. }
  23. vector<set<int>> b(n+1);
  24. for(int i=0;i<n-1;i++){
  25. int y,z;
  26. cin >> y >> z;
  27. b[y].insert(z);
  28. b[z].insert(y);
  29. }
  30. if(x == 0){
  31. cout << "YES" << endl;
  32. }
  33. else{
  34. if(k == 2){
  35. cout << "NO" << endl;
  36. }
  37. else{
  38. stack<int> st;
  39. st.push(1);
  40. int cnt(0);
  41. while(st.size() > 0){
  42. int tp = st.top();
  43. if(b[tp].size() > 0){
  44. int fir = *b[tp].begin();
  45. b[fir].erase(tp);
  46. b[tp].erase(fir);
  47. st.push(fir);
  48. }
  49. else{
  50. int s = st.top();
  51. if(c[s] == x){
  52. cnt++;
  53. }
  54. st.pop();
  55. if(st.size() > 0){
  56. int zz = st.top();
  57. // cout << zz << " " << s << endl;
  58.  
  59. if(c[s] != x){
  60. c[zz] = c[zz] ^ c[s];
  61. }
  62.  
  63.  
  64. }
  65. }
  66. }
  67.  
  68. if(cnt >= 2){
  69. cout << "YES" << endl;
  70. }
  71. else{
  72. cout << "NO" << endl;
  73. }
  74.  
  75. }
  76. }
  77.  
  78. }
  79. return 0;
  80. }
Success #stdin #stdout 0.01s 5500KB
stdin
5
2 2
1 3
1 2
5 5
3 3 3 3 3
1 2
2 3
1 4
4 5
5 2
1 7 2 3 5
1 2
2 3
1 4
4 5
5 3
1 6 4 1 2
1 2
2 3
1 4
4 5
3 3
1 7 4
1 2
2 3
stdout
NO
YES
NO
YES
NO