Advertisement
willy108

yet anther segtree

Oct 9th, 2022
1,309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1.  
  2. //misaka and elaina will carry me to master
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <cmath>
  7. #include <utility>
  8. #include <cassert>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <functional>
  12. #include <numeric>
  13. #include <set>
  14. #include <array>
  15. #include <queue>
  16. #include <map>
  17. #include <chrono>
  18. #include <random>
  19.  
  20. #define ll long long
  21. #define lb long double
  22. #define sz(vec) ((int)(vec.size()))
  23. #define all(x) x.begin(), x.end()
  24. #define pb push_back
  25. #define mp make_pair
  26. #define kill(x, s) {int COND = x; if(COND){ cout << s << "\n"; return ; }}
  27.  
  28. #ifdef ONLINE_JUDGE
  29. #define cerr while(0) cerr
  30. #endif
  31.  
  32. const lb eps = 1e-9;
  33. const ll mod = 1e9 + 7, ll_max = 1e18;
  34. //const ll mod = (1 << (23)) * 119 +1, ll_max = 1e18;
  35. const int MX = 2e5 +10, int_max = 0x3f3f3f3f;
  36.  
  37. struct {
  38.   template<class T>
  39.   operator T() {
  40.     T x; std::cin >> x; return x;
  41.   }
  42. } in;
  43.  
  44. using namespace std;
  45.  
  46. int a[MX], b[MX], c[MX], d[MX];
  47. int n, q;
  48. vector<pair<int, int>> cache;
  49. const int magic = 800;
  50.  
  51. inline int form(int i){
  52.     return (1ll*i*(i+1)/2)%mod;//%mod * (i+2)%mod * inv%mod;
  53. }
  54.  
  55. void rebuild(){
  56.     cache.clear();
  57.     for(int i = 1; i<=n; i++){
  58.         b[i] = b[i-1] + a[i];
  59.         if(b[i] > mod) b[i] -= mod;
  60.         //a[i] %= mod;
  61.     }
  62.     for(int i = 1; i<=n; i++){
  63.         c[i] = c[i-1] + b[i];
  64.         if(c[i] > mod) c[i] -= mod;
  65.         //c[i] %= mod;
  66.     }
  67.     for(int i = 1; i<=n; i++){
  68.         d[i] = d[i-1] + c[i];
  69.         if(d[i] > mod) d[i] -= mod;
  70.         //d[i] %= mod;
  71.     }
  72. }
  73.  
  74. int contr(int x){
  75.     int ans = 0;
  76.     for(auto [i, v] : cache){
  77.         if(x < i) continue ;
  78.         ans += 1ll*form(x -i + 1) * v%mod;
  79.         if(ans > mod) ans -= mod;
  80.         //ans %= mod;
  81.     }
  82.     return ans;
  83. }
  84.  
  85. void solve(){
  86.     n = in, q=in;
  87.     //a[1] = 1;
  88.     for(int i= 1; i<=n; i++){
  89.         a[i] = in;
  90.     }
  91.     rebuild();
  92.     cache.reserve(magic);
  93.  
  94.     for(int i = 1; i<=q; i++){
  95.         int op = in;
  96.         if(op == 1){
  97.             int j = in, b = in;
  98.             cache.pb(mp(j, (b + mod - a[j])%mod));
  99.             a[j] = b;
  100.         }else{
  101.             int a = in;
  102.             cout << (d[a] + contr(a))%mod << "\n";
  103.         }
  104.         if(sz(cache) > magic){
  105.             rebuild();
  106.             cache.reserve(magic);
  107.         }
  108.     }
  109.    
  110.    
  111. }
  112.  
  113. signed main(){
  114.   cin.tie(0) -> sync_with_stdio(0);
  115.  
  116.   int T = 1;
  117.   //cin >> T;
  118.   for(int i = 1; i<=T; i++){
  119.         solve();
  120.     }
  121.   return 0;
  122. }
  123.  
  124.  
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement