fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int oo = 2e5 + 3;
  7.  
  8. int t, n, q;
  9. int a[oo];
  10.  
  11. /*
  12. - Các giá trị XOR được phép là 3,6,9,12,15. Kết hợp nhiều thao tác,
  13. ta tạo được mọi số 4 bit có số bit 1 chẵn.
  14. - XOR với số có popcount chẵn không làm thay đổi tính chẵn lẻ của popcount(a[i]).
  15. - Các số chia hết cho 3 trong đoạn [0,15] đều có popcount chẵn.
  16. Vì vậy, phần tử có popcount lẻ không thể thỏa mãn.
  17. - Chứng minh đạt được: Nhờ các thao tác XOR trên hai phần tử kề nhau,
  18. ta có thể biến đổi mọi phần tử có popcount chẵn thành số chia hết cho 3.
  19. - Có phần tử popcount lẻ: Dùng nó làm trung gian để đưa tất cả phần tử chẵn về 0.
  20. - Tất cả đều chẵn: Đưa \(n-2\) phần tử về 0, sau đó biến hai phần tử cuối thành các bội của 3.
  21. - Kết luận: Đáp án là số lượng phần tử có popcount chẵn.
  22.  
  23. - Truy vấn: Khi thay a[p] = x, trừ đóng góp của giá trị cũ và cộng đóng góp của giá trị mới.
  24. */
  25.  
  26. bool ok(int n) {
  27. return __builtin_popcount(n) % 2 == 0;
  28. }
  29.  
  30. void solve() {
  31. cin >> n >> q;
  32.  
  33. int res = 0;
  34. for (int i = 1; i <= n; i++) {
  35. cin >> a[i];
  36. res += ok(a[i]);
  37. }
  38.  
  39. cout << res <<" ";
  40.  
  41. while(q--) {
  42. int p, x;
  43. cin >> p >> x;
  44. res -= ok(a[p]);
  45. a[p] = x;
  46. res += ok(a[p]);
  47.  
  48. cout << res <<" ";
  49. }
  50. cout << "\n";
  51. }
  52.  
  53. int32_t main() {
  54.  
  55. cin >> t;
  56.  
  57. while(t--) {
  58. solve();
  59. }
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0.01s 5324KB
stdin
3
2 1
10 3
1 0
3 3
15 1 5
3 0
1 10
2 0
4 0
1 2 3 4
stdout
2 2 
2 2 2 3 
1