Advertisement
Zeinab_Hamdy

Untitled

Jul 20th, 2024
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.48 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define nl "\n"
  4. #define fi first
  5. #define se second
  6. #define pb push_back
  7. #define ll long long
  8. #define RV return void
  9. #define sz(x) int(x.size())
  10. #define all(v) v.begin(), v.end()
  11. #define rall(v) v.rbegin(), v.rend()
  12. #define fixed(n) fixed << setprecision(n)
  13. #define cin(v) for(auto&x:v) cin >> x;
  14. #define cout(v) for(auto&x:v) cout << x << " ";
  15. void files(){
  16.     #ifndef ONLINE_JUDGE
  17.        freopen("input.txt", "r", stdin);
  18.        freopen("output.txt", "w", stdout);
  19.     #endif
  20. }
  21.  
  22.  
  23. const ll mod = 1e9+7;
  24.  
  25. ll mul(ll a , ll b){
  26.     return ( (a%mod) * (b % mod)) %mod;
  27. }
  28.  
  29. struct node {
  30.     ll sumx , sumx2 , sumx3 , ret , tot ;
  31.  
  32.     node(){
  33.         sumx=sumx2=sumx3=ret=tot=0;
  34.     }
  35.  
  36.     node(ll x){
  37.         sumx = x;
  38.         sumx2= mul(x,x);
  39.         sumx3= mul(x, mul(x,x));
  40.         tot = ret =0;
  41.     }
  42.  
  43.     // void change(ll x){
  44.     //     val += x;
  45.     // }
  46. };
  47.  
  48. struct Lazy{
  49.     vector < node > tree;
  50.     vector<ll>lazy;
  51.     int tree_size;
  52.  
  53.     Lazy(int n){
  54.         tree_size = 1;
  55.         while (tree_size < n) tree_size *= 2;
  56.         tree.assign(2 * tree_size , node());
  57.         lazy.assign(2 * tree_size , 0);
  58.     }
  59.  
  60.     node merge(node a , node b){
  61.         node res = node();
  62.         res.sumx= a.sumx % mod + b.sumx %mod;
  63.         res.sumx2= a.sumx2 % mod + b.sumx2 %mod;
  64.         res.sumx3= a.sumx3 % mod + b.sumx3 %mod;
  65.         res.ret= a.ret % mod + b.ret %mod;
  66.         res.tot= a.tot % mod + b.tot %mod;
  67.  
  68.  
  69.         res.sumx %=mod;
  70.         res.sumx2 %=mod;
  71.         res.sumx3 %=mod;
  72.         res.tot %=mod;
  73.         res.ret %=mod;
  74.  
  75.         return res;
  76.     }
  77.  
  78.     void build(vector < ll > &v , int x , int lx , int rx){
  79.         if(rx - lx == 1){
  80.             if(lx < sz(v)) tree[x] = node(v[lx]);
  81.             return;
  82.         }
  83.  
  84.         int m = (lx + rx) / 2;
  85.         build(v , 2 * x + 1 , lx , m);
  86.         build(v , 2 * x + 2 , m , rx);
  87.         tree[x] = merge(tree[2 * x + 1] , tree[2 * x + 2]);
  88.     }
  89.  
  90.     void build(vector < ll > &v){
  91.         build(v , 0 , 0 , tree_size);
  92.     }
  93.  
  94.     void push(int x , int lx , int rx){
  95.         if(lazy[x]>0 ){
  96.             // cout << x << " " << lazy[x] << nl;
  97.             tree[x].tot += lazy[x];
  98.             tree[x].tot %= mod;
  99.             if(rx - lx != 1){
  100.                 lazy[2 * x + 1] += lazy[x];
  101.                 lazy[2 * x + 1] %= mod;
  102.  
  103.                 lazy[2 * x + 2] += lazy[x];
  104.                 lazy[2 * x + 2] %= mod;
  105.             }
  106.             lazy[x] = 0;
  107.            
  108.         }
  109.     }
  110.  
  111.     void update(int l , int r , int val , int x , int lx , int rx){
  112.         push(x , lx , rx);
  113.         if(lx >= r || rx <= l) return;
  114.         if(lx >= l && rx <= r){
  115.  
  116.             tree[x].tot += val;
  117.             tree[x].tot %= mod;
  118.  
  119.             // cout << x << " " << tree[x].tot << nl;
  120.        
  121.             if(rx - lx != 1){
  122.                 lazy[x * 2 + 1] += val;
  123.                 lazy[x * 2 + 1] %= mod;
  124.  
  125.                 lazy[x * 2 + 2] += val;
  126.                 lazy[x * 2 + 2] %= mod;
  127.             }
  128.             return;
  129.         }
  130.  
  131.         int m = (lx + rx) / 2;
  132.         update(l , r , val , 2 * x + 1 , lx , m);
  133.         update(l , r , val , 2 * x + 2 , m , rx);
  134.         tree[x] = merge(tree[2 * x + 1] , tree[2 * x + 2]);
  135.     }
  136.  
  137.     void update(int l , int r , int val){
  138.         update(l , r , val , 0 , 0 , tree_size);
  139.     }
  140.  
  141.     node query(int l , int r , int x , int lx , int rx){
  142.         // cout << x << " " << tree[x].tot << " " << lazy[x] << nl;
  143.         push(x , lx , rx);
  144.         if(lx >= r || rx <= l) return node();
  145.         if(lx >= l && rx <= r) {
  146.             //  y^3 + sum(x^3) + 3yx^2 + 3xy^2
  147.  
  148.             // cout << x << nl;
  149.             // cout << tree[x].tot << nl;
  150.  
  151.             ll y = tree[x].tot %mod;
  152.             tree[x].ret = mul(mul(y , mul(y,y)) , rx-lx);
  153.             tree[x].ret %= mod;
  154.  
  155.             tree[x].ret += tree[x].sumx3;
  156.             tree[x].ret %= mod;
  157.  
  158.             tree[x].ret += mul( mul(3,y) , tree[x].sumx2);
  159.             tree[x].ret %= mod;
  160.  
  161.             tree[x].ret += mul(mul(3 , mul(y,y)) , tree[x].sumx);
  162.             tree[x].ret %= mod;
  163.  
  164.        
  165.             return tree[x];
  166.         }
  167.        
  168.         int m = (lx + rx) / 2;
  169.         node left = query(l , r , 2 * x + 1 , lx , m);
  170.         node right = query(l , r , 2 * x + 2 , m , rx);
  171.         node ans=node();
  172.         ans.ret = left.ret%mod + right.ret%mod;
  173.         ans.ret %= mod;
  174.         return ans;
  175.     }
  176.  
  177.     node query(int l , int r) {
  178.         return query(l, r, 0, 0, tree_size);
  179.     }
  180.  
  181. };
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188. void solve(){
  189.  
  190.  
  191.     int n ; cin >> n ;
  192.     vector < ll > v(n);
  193.     cin(v);
  194.     Lazy seg(n);
  195.     seg.build(v);
  196.  
  197.     int q; cin >> q;
  198.     ll y =0;
  199.     while(q--){
  200.         int op ;
  201.         cin >> op;
  202.         if(op==1){
  203.             //  update
  204.             int l , r ;
  205.             ll val; cin >> l >> r >> val;
  206.             seg.update(l-1 ,r , val);
  207.  
  208.         }else{
  209.             int l ,r; cin >> l >> r;
  210.             cout << seg.query(l-1 ,r).ret<< nl;
  211.            
  212.         }
  213.     }
  214.    
  215.  
  216. }      
  217.  
  218. // 955575183
  219. // 270524667
  220. // 624270388
  221. // 811103748
  222. // 469845835
  223.  
  224. // 1358
  225. // 1792
  226. // 3710
  227.  
  228.  
  229.  
  230. int main(){
  231.     ios_base::sync_with_stdio(false);
  232.     cin.tie(nullptr);
  233.     cout.tie(nullptr);  
  234.     //  files();
  235.    
  236.    
  237.  
  238.     int testCase=1;
  239.         // cin >> testCase ;
  240.     for(int i=1 ; i <= testCase ; i++){
  241.         // cout << "Case "<< i <<": " << nl;
  242.         solve();
  243.     }
  244.  
  245.     return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement