fork download
  1. uses math;
  2. var it, s: array[0..400001] of longint;
  3. p: array[0..400001] of boolean;
  4. n, m: longint;
  5. {------------------------------}
  6. procedure down(c, l, r: longint);
  7. begin
  8. p[l] := p[c];
  9. p[r] := p[c];
  10. if p[c] then
  11. begin
  12. it[l] := s[l] - it[l];
  13. it[r] := s[r] - it[r];
  14. end;
  15. p[c] := false;
  16. end;
  17. {------------------------------}
  18. procedure update(x, l, r, u, v: longint);
  19. var c, g: longint;
  20. begin
  21. s[x] := r - l + 1;
  22. if (l > v) or (r < u) then
  23. exit;
  24. if (l >= u) and (r <= v) then
  25. begin
  26. p[x] := true;
  27. it[x] := s[x] - it[x];
  28. exit;
  29. end;
  30. c := x * 2;
  31. g := (l + r) div 2;
  32. s[c] := g - l + 1;
  33. s[c + 1] := r - g;
  34. down(x, c, c + 1);
  35. update(c, l, g, u, v);
  36. update(c + 1, g + 1, r, u, v);
  37. it[x] := it[c] + it[c + 1];
  38. end;
  39. {------------------------------}
  40. function query(x, l, r, u, v: longint): longint;
  41. var c, g, t1, t2: longint;
  42. begin
  43. s[x] := r - l + 1;
  44. if (l > v) or (r < u) then
  45. exit(0);
  46. if (l >= u) and (r <= v) then
  47. exit(it[x]);
  48. c := x * 2;
  49. g := (l + r) div 2;
  50. s[c] := g - l + 1;
  51. s[c + 1] := r - g;
  52. down(x, c, c + 1);
  53. t1 := query(c, l, g, u, v);
  54. t2 := query(c + 1, g + 1, r, u, v);
  55. it[x] := it[c] + it[c + 1];
  56. exit(t1 + t2);
  57. end;
  58. {------------------------------}
  59. procedure solve;
  60. var i, u, v, c: longint;
  61. begin
  62. readln(n, m);
  63. for i := 1 to m do
  64. begin
  65. read(c);
  66. if c = 0 then
  67. begin
  68. readln(u, v);
  69. update(1, 1, n, u, v);
  70. end
  71. else
  72. begin
  73. readln(u, v);
  74. writeln(query(1, 1, n, u, v));
  75. end;
  76. end;
  77. end;
  78. {------------------------------}
  79. begin
  80. solve;
  81. end.
Success #stdin #stdout 0s 3964KB
stdin
4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4
stdout
1
2