cincout

Корневая (Есть/нет на отрезке + add)

Jun 18th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. const int L = 400;
  7. const int N = 100005;
  8.  
  9. vector <int> blocks[L];
  10. int add[L], ar[N], n, q;
  11.  
  12. void remake(int num)
  13. {
  14. blocks[num].clear();
  15. int id = num * L;
  16. while (id < n && id / L == num)
  17. blocks[num].push_back(ar[id++]);
  18. sort(blocks[num].begin(), blocks[num].end());
  19. }
  20.  
  21. bool haveHeight(int num, int h)
  22. {
  23. int l = 0, r = blocks[num].size() - 1;
  24. while (l <= r) {
  25. int mid = (l + r) / 2;
  26. if (blocks[num][mid] + add[num] == h) {
  27. return 1;
  28. }
  29. if (blocks[num][mid] + add[num] < h) {
  30. l = mid + 1;
  31. }
  32. else {
  33. r = mid - 1;
  34. }
  35. }
  36. return 0;
  37. }
  38.  
  39. int main()
  40. {
  41. ios_base::sync_with_stdio(0);
  42. cin.tie(0);
  43. cin >> n >> q;
  44. for (int i = 0; i < n; ++i) {
  45. cin >> ar[i];
  46. blocks[i / L].push_back(ar[i]);
  47. }
  48. for (int i = 0; i <= (n - 1) / L; ++i)
  49. sort(blocks[i].begin(), blocks[i].end());
  50. for (int z = 0; z < q; ++z) {
  51. char req;
  52. cin >> req;
  53. if (req == '+') {
  54. int l, r, pl;
  55. cin >> l >> r >> pl;
  56. --l, --r;
  57. set <int> reBuild;
  58. for (int i = l; i <= r; ) {
  59. if (i % L == 0 && i + L - 1 <= r) {
  60. add[i / L] += pl;
  61. i += L;
  62. }
  63. else {
  64. ar[i] += pl;
  65. reBuild.insert(i / L);
  66. i++;
  67. }
  68. }
  69. for (int i : reBuild)
  70. remake(i);
  71. }
  72. else {
  73. int l, r, h;
  74. cin >> l >> r >> h;
  75. --l, --r;
  76. bool hasFind = 0;
  77. for (int i = l; i <= r; ) {
  78. if (i % L == 0 && i + L - 1 <= r) {
  79. hasFind |= haveHeight(i / L, h);
  80. i += L;
  81. }
  82. else {
  83. if (add[i / L] + ar[i] == h) {
  84. hasFind = 1;
  85. }
  86. i++;
  87. }
  88. }
  89. cout << (hasFind ? "YES\n" : "NO\n");
  90. }
  91. }
  92. return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment