matistjati

Untitled

Jun 23rd, 2026
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. using namespace std;
  2. #include <bits/stdc++.h>
  3.  
  4. using ll = long long;
  5.  
  6. const ll mod = 1e9 + 7;
  7. ll euclid(ll a, ll b, ll &x, ll &y) {
  8. if (!b) return x = 1, y = 0, a;
  9. ll d = euclid(b, a % b, y, x);
  10. return y -= a/b * x, d;
  11. }
  12.  
  13. struct Mod {
  14. ll x;
  15. Mod(ll y) : Mod(y%mod+mod,0){}
  16. Mod(ll y,int) : x(y<mod?y:y-mod){}
  17. Mod operator+(Mod b) { return {x + b.x,0}; }
  18. Mod operator-(Mod b) { return {x - b.x + mod,0}; }
  19. Mod operator*(Mod b) { return {x * b.x % mod,0}; }
  20. Mod operator/(Mod b) { return *this * invert(b); }
  21. Mod invert(Mod a) {
  22. ll x,y;
  23. assert(euclid(a.x,mod,x,y)==1); return x;
  24. }
  25. Mod operator^(ll e) {
  26. if (!e) return Mod(1);
  27. Mod r = *this ^ (e / 2); r = r * r;
  28. return e&1 ? *this * r : r;
  29. }
  30. };
  31.  
  32.  
  33. struct Tree {
  34. vector<Mod> tree;
  35. vector<Mod> lazy;
  36. vector<Mod> prefixI;
  37. int n;
  38.  
  39. Tree(int n, vector<Mod> pfi) : n(n), tree(4 * n, Mod(0)), lazy(4 * n, Mod(0)), prefixI(pfi) {}
  40.  
  41. void push(int x, int l, int r) {
  42. int mid = (l + r) / 2;
  43. tree[x * 2] = tree[x * 2] + lazy[x] * (prefixI[mid] - prefixI[max(0, l - 1)]);
  44. lazy[x * 2] = lazy[x * 2] + lazy[x];
  45. tree[x * 2 + 1] = tree[x * 2 + 1] + lazy[x] * (prefixI[r] - prefixI[mid]);
  46. lazy[x * 2 + 1] = lazy[x * 2 + 1] + lazy[x];
  47. lazy[x] = 0;
  48. }
  49.  
  50. void add(int x, int l, int r, int ql, int qr, Mod v) {
  51. if (l > qr || r < ql) return;
  52. if (l >= ql && r <= qr) {
  53. tree[x] = tree[x] + v * (prefixI[r] - prefixI[l - 1]);
  54. lazy[x] = lazy[x] + v;
  55. return;
  56. }
  57. push(x, l, r);
  58. int mid = (l + r) / 2;
  59. add(x * 2, l, mid, ql, qr, v);
  60. add(x * 2 + 1, mid + 1, r, ql, qr, v);
  61. tree[x] = tree[x * 2] + tree[x * 2 + 1];
  62. }
  63.  
  64. void add(int l, int r, Mod v) { add(1, 0, n - 1, l, r, v); }
  65.  
  66. Mod query(int x, int l, int r, int ql, int qr) {
  67. if (l > qr || r < ql) return 0;
  68. if (l >= ql && r <= qr) return tree[x];
  69. push(x, l, r);
  70. int mid = (l + r) / 2;
  71. return query(x * 2, l, mid, ql, qr) + query(x * 2 + 1, mid + 1, r, ql, qr);
  72. }
  73.  
  74. Mod query(int l, int r) { return query(1, 0, n - 1, l, r); }
  75. };
  76.  
  77. Mod poly(ll l, int i) {
  78. if (i == 0) return Mod(-l) * Mod(l * l) + Mod(6 * l * l) - Mod(11 * l) + Mod(6);
  79. if (i == 1) return Mod(3 * l * l) - Mod(12 * l) + Mod(11);
  80. if (i == 2) return Mod(-3 * l) + Mod(6);
  81. else return 1;
  82. }
  83.  
  84.  
  85. int main() {
  86. cin.tie(0)->sync_with_stdio(0);
  87.  
  88. int n, q;
  89. cin >> n >> q;
  90. n += 5;
  91.  
  92. vector<vector<Mod>> sum(4, vector<Mod>(n, Mod(0)));
  93. for (int i = 1; i < n; i++) {
  94. sum[0][i] = sum[0][i - 1] + Mod(1);
  95. sum[1][i] = sum[1][i - 1] + Mod(i);
  96. sum[2][i] = sum[2][i - 1] + Mod(i) * Mod(i);
  97. sum[3][i] = sum[3][i - 1] + Mod(i) * Mod(i) * Mod(i);
  98. }
  99.  
  100. vector<Tree> trees = {
  101. Tree(n, sum[0]),
  102. Tree(n, sum[1]),
  103. Tree(n, sum[2]),
  104. Tree(n, sum[3])
  105. };
  106.  
  107. while (q--) {
  108. int t, l, r;
  109. cin >> t >> l >> r;
  110.  
  111. if (t == 1) {
  112. for (int i = 0; i < 4; i++) trees[i].add(l, r, poly(l, i));
  113. }
  114. else if (t == 2) {
  115. for (int i = 0; i < 4; i++) trees[i].add(l, r, Mod(0) - poly(l, i));
  116. }
  117. else {
  118. Mod v = 0;
  119. for (int i = 0; i < 4; i++) v = v + trees[i].query(l, r);
  120. cout << v.x << "\n";
  121. }
  122. }
  123.  
  124. return 0;
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment