fork download
  1. /**
  2.  * author: orzvanh14
  3.  * created: 23.12.2022 10:08:02
  4.  * too lazy to update time
  5. **/
  6. // i wants to take ioi
  7. //binhtinhtutinkhongcaycunhungmotkhikhongcontutinnualatuyetvong
  8. #include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11.  
  12. #define int long long
  13. #define nn "\n"
  14. #define pi pair<int, int>
  15. #define fi first
  16. #define se second
  17. #define lb lower_bound
  18. #define ub upper_bound
  19. #define eb emplace_back
  20. #define pb push_back
  21. #define TASK " "
  22.  
  23. #define ms(a, x) memset(a, x, sizeof(a))
  24. #define all(a) a.begin(), a.end()
  25. #define All(a, n) a + 1, a + 1 + n
  26.  
  27. #define LOG 19
  28.  
  29.  
  30. const int INF = 1e18;
  31. const int mod = 1e3+7;
  32. const int N = 2e5 + 5;
  33. const int maxN = 1e5 + 5;
  34. int MOD = 998244353;
  35. int bit[200000];
  36. struct node{
  37. int kc, u, hk;
  38. bool operator<(const node& other) const {
  39. return kc > other.kc;
  40. }
  41. };
  42. struct edge{
  43. int u, v, w, id;
  44. friend bool operator < ( edge a, edge b){
  45. return a.w > b.w;
  46. }
  47. };
  48. int n,q;
  49. int a[N];
  50. int st[4 * N]; int lazy[4 * N];
  51. int dp[N];
  52. void nhap(){
  53. cin >> n >> q;
  54. // for(int i = 1;i <= n; i++){
  55. // cin >> a[i];
  56. // }
  57. }
  58. pi fast_doubling(int n){
  59. if (n == 0) return {0, 1};
  60. pi p = fast_doubling(n >> 1);
  61. int fk = p.fi;
  62. int fk1 = p.se;
  63. int f2k = (fk * ((2 * fk1 - fk + mod) % mod)) % mod;
  64. int f2k1 = (fk1 * fk1 % mod + fk * fk % mod) % mod;
  65. if(n % 2 == 0) return {f2k, f2k1};
  66. else return {f2k1, (f2k + f2k1) % mod};
  67. }
  68. void build(int id, int l, int r){
  69. if(l == r){
  70. st[id] = a[l];
  71. }
  72. else{
  73. int m = l + r >> 1;
  74. build(2 * id, l, m);
  75. build(2 * id + 1, m + 1, r);
  76. st[id] = st[2 * id] + st[2 * id + 1];
  77. }
  78. }
  79. void fix(int id, int l, int r){
  80. if(!lazy[id]) return;
  81. st[id] = (st[id] + lazy[id] * (r - l + 1)) % mod;
  82.  
  83. if(l != r){
  84. lazy[2 * id] = (lazy[2 * id] + lazy[id]) % mod;
  85. lazy[2 * id + 1] = (lazy[2 * id + 1] + lazy[id]) % mod;
  86. }
  87. lazy[id] = 0;
  88. }
  89. void update(int id, int l, int r, int u, int v,int val){
  90. fix(id, l, r);
  91. if(l > v || r < u) return;
  92. if(l >= u && r <= v){
  93. lazy[id] = (lazy[id] + fast_doubling(val).fi) % mod;
  94. fix(id, l, r);
  95. return;
  96. }
  97. int m = l + r >> 1;
  98. update(2 * id, l, m, u, v, val);
  99. update(2 * id + 1, m + 1, r, u, v, val);
  100. st[id] = (st[2 * id] + st[2 * id + 1]) % mod;
  101. }
  102. int get(int id,int l,int r,int u,int v){
  103. fix(id, l , r);
  104. if(l > v || u > r) return 0;
  105. if(l >= u && r <= v){
  106. return st[id];
  107. }
  108. int m = l + r >> 1;
  109. int get1 = get(2 * id, l, m, u, v);
  110. int get2 = get(2 * id + 1, m + 1, r, u, v);
  111. return (get1 + get2) % mod;
  112. }
  113. void solve(){
  114. int ans = 0;
  115. // build(1, 1, n);
  116. while(q--){
  117. int op;
  118. cin >> op;
  119. if(op == 1){
  120. int l, r, k;
  121. cin >> l >> r >> k;
  122. update(1, 1, n, l, r, k);
  123. }
  124. else{
  125. int l, r;
  126. cin >> l >> r;
  127. cout << get(1, 1, n, l, r) << nn;
  128. }
  129. }
  130. }
  131. signed main() {
  132. // freopen("piggyback.in", "r", stdin);
  133. // freopen("piggyback.out", "w", stdout);
  134. ios_base::sync_with_stdio(0);
  135. cin.tie(0);
  136. cout.tie(0);
  137. nhap();
  138. solve();
  139. return (0 ^ 0);
  140.  
  141. }
  142.  
Success #stdin #stdout 0s 5324KB
stdin
Standard input is empty
stdout
Standard output is empty