main.cc 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. using std::max;
  5. #define N 100000
  6. #define Q 100000
  7. bool A[N];
  8. int P[Q];
  9. bool V[Q];
  10. int dp[2][N + 1];
  11. bool int2bool(int i) {
  12. int b = 0;
  13. while (0 < i) {
  14. b += i & 1;
  15. i >>= 1;
  16. }
  17. return b & 1;
  18. }
  19. int main() {
  20. int T;
  21. scanf("%d", &T);
  22. for (int t = 1; t <= T; t++) {
  23. int n, q;
  24. scanf("%d %d", &n, &q);
  25. for (int i = 0, j; i < n; i++) {
  26. scanf("%d", &j);
  27. A[i] = int2bool(j);
  28. }
  29. for (int i = 0, j; i < q; i++) {
  30. scanf("%d %d", &P[i], &j);
  31. V[i] = int2bool(j);
  32. }
  33. printf("Case #%d:", t);
  34. for (int i = 0; i < q; i++) {
  35. A[P[i]] = V[i];
  36. memset(dp, 0, sizeof(dp));
  37. for (int j = 1; j <= n; j++) {
  38. if (A[j - 1]) { // Odd
  39. dp[1][j] = dp[0][j - 1] + 1;
  40. dp[0][j] = dp[1][j - 1] != 0 ? dp[1][j - 1] + 1 : 0;
  41. } else { // Even
  42. dp[1][j] = max(0, dp[1][j - 1] + 1);
  43. dp[0][j] = max(1, dp[0][j - 1] + 1);
  44. }
  45. }
  46. int l = 0;
  47. for (int j = 1; j <= n; j++) l = max(l, dp[0][j]);
  48. printf(" %d", l);
  49. }
  50. printf("\n");
  51. }
  52. return 0;
  53. }