Guest User

Untitled

a guest
Dec 12th, 2021
711
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. // Super Idol的笑容
  2. //    都没你的甜
  3. //  八月正午的阳光
  4. //    都没你耀眼
  5. //  热爱105°C的你
  6. // 滴滴清纯的蒸馏水
  7.  
  8. #include <bits/stdc++.h>
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11. #include <ext/rope>
  12. using namespace std;
  13. using namespace __gnu_pbds;
  14. using namespace __gnu_cxx;
  15. #define ll long long
  16. #define ii pair<ll,ll>
  17. #define iii pair<ii,ll>
  18. #define fi first
  19. #define se second
  20. #define endl '\n'
  21. #define debug(x) cout << #x << ": " << x << endl
  22.  
  23. #define pub push_back
  24. #define pob pop_back
  25. #define puf push_front
  26. #define pof pop_front
  27. #define lb lower_bound
  28. #define ub upper_bound
  29.  
  30. #define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
  31. #define all(x) (x).begin(),(x).end()
  32. #define sz(x) (int)(x).size()
  33.  
  34. #define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
  35. //change less to less_equal for non distinct pbds, but erase will bug
  36.  
  37. mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
  38.  
  39. const int MOD=1000000007;
  40.  
  41. ll fix(ll i){
  42.     i%=MOD;
  43.     if (i<0) i+=MOD;
  44.     return i;
  45. }
  46.  
  47. const ll BUC=250;
  48.  
  49. ll n,m,q;
  50. ll arr[50005];
  51. ll d[50005];
  52. ll dd[50005];
  53.  
  54. ll prefarr[50005];
  55. ll prefd2[50005];
  56. ll prefd[50005];
  57.  
  58. ll extra[50005];
  59. ll extra2d[50005];
  60.  
  61. ll sum[50005];
  62.  
  63. struct U{
  64.     ll l,r;
  65.     ll v;
  66. };
  67.  
  68. U upd[50005];
  69.  
  70. ll pos(ll x){
  71.     return (x-1)%BUC+1;
  72. }
  73.  
  74. vector<ll> disc;
  75.  
  76. struct Q{
  77.     ll l,r;
  78.     ll v;
  79.     ll idx;
  80. };
  81.  
  82. vector<Q> qu[50005];
  83. ll ans[50005];
  84.  
  85. int main(){
  86.     ios::sync_with_stdio(0);
  87.     cin.tie(0);
  88.     cout.tie(0);
  89.     cin.exceptions(ios::badbit | ios::failbit);
  90.    
  91.     cin>>n>>m>>q;
  92.     rep(x,1,n+1) cin>>d[x];
  93.     rep(x,1,n+1) d[x]=(d[x]+MOD)%MOD;
  94.    
  95.     rep(x,1,n+1) arr[x]=d[x]*d[x]%MOD;
  96.    
  97.     ll A,B,C,D;
  98.     rep(x,1,m+1){
  99.         cin>>A>>B>>C;
  100.         upd[x]={A,B,(C+MOD)%MOD};
  101.     }
  102.    
  103.     rep(x,0,q){
  104.         cin>>A>>B>>C>>D;
  105.         if (C) qu[C-1].pub({A,B,-1,x});
  106.         qu[D].pub({A,B,1,x});
  107.     }
  108.    
  109.     rep(x,1,n+1) prefarr[x]=(prefarr[x-1]+arr[x])%MOD;
  110.     for (auto &it:qu[0]){
  111.         ans[it.idx]=fix(ans[it.idx]+it.v*(prefarr[it.r]-prefarr[it.l-1]));
  112.     }
  113.    
  114.     rep(x,1,m+1){
  115.         if (x%BUC==1){
  116.             disc={1};
  117.             rep(y,x,min(x+BUC,m+1)){
  118.                 disc.pub(upd[y].l);
  119.                 if (upd[y].r!=n) disc.pub(upd[y].r+1);
  120.             }
  121.            
  122.             sort(all(disc));
  123.             disc.erase(unique(all(disc)),disc.end());
  124.            
  125.             // cout<<"debug disc: "<<x<<endl;
  126.             // for (auto &it:disc) cout<<it<<" "; cout<<endl;
  127.            
  128.             rep(x,1,n+1){
  129.                 prefarr[x]=(prefarr[x-1]+arr[x])%MOD;
  130.                 prefd2[x]=(prefd2[x-1]+d[x]*d[x])%MOD;
  131.                 prefd[x]=(prefd[x-1]+d[x])%MOD;
  132.             }
  133.            
  134.             disc.pub(n+1);
  135.            
  136.             rep(x,0,sz(disc)-1){
  137.                 extra[x]=extra2d[x]=sum[x]=0;
  138.             }
  139.             rep(x,1,n+1) dd[x]=0;
  140.         }
  141.        
  142.         rep(y,0,sz(disc)-1) if (upd[x].l<=disc[y] && disc[y]<=upd[x].r){
  143.             sum[y]=(sum[y]+upd[x].v)%MOD;
  144.         }
  145.         rep(y,0,sz(disc)-1){
  146.             extra[y]=(extra[y]+sum[y]*sum[y])%MOD;
  147.             extra2d[y]=(extra2d[y]+sum[y])%MOD;
  148.         }
  149.        
  150.         // cout<<"current prefix sums: "<<endl;
  151.         // int IDX=0;
  152.         // rep(y,1,n+1){
  153.             // if (disc[IDX+1]==y) IDX++;
  154.             // cout<<(arr[y]+pos(x)*d[y]%MOD*d[y]+2*d[y]*extra2d[IDX]+extra[IDX])%MOD<<" ";
  155.         // } cout<<endl;
  156.        
  157.         for (auto &it:qu[x]){
  158.             ans[it.idx]=fix(ans[it.idx]+
  159.                 it.v*(prefarr[it.r]-prefarr[it.l-1]+pos(x)*(prefd2[it.r]-prefd2[it.l-1])));
  160.                
  161.            
  162.             rep(y,0,sz(disc)-1){
  163.                 int r=min(it.r,disc[y+1]-1),l=max(it.l,disc[y])-1;
  164.                 if (l>=r) continue;
  165.                
  166.                 ans[it.idx]=fix(ans[it.idx]+
  167.                     it.v*(2*(prefd[r]-prefd[l])*extra2d[y]+(r-l)*extra[y]));
  168.             }
  169.            
  170.             // cout<<"debug: "<<it.idx<<endl;
  171.             // cout<<ans[it.idx]<<endl;
  172.         }
  173.        
  174.         dd[upd[x].l]=fix(dd[upd[x].l]+upd[x].v);
  175.         dd[upd[x].r+1]=fix(dd[upd[x].r+1]-upd[x].v);
  176.        
  177.         if (x%BUC==0){
  178.             int IDX=0;
  179.             rep(y,1,n+1){
  180.                 if (disc[IDX+1]==y) IDX++;
  181.                 arr[y]=(arr[y]+pos(x)*d[y]%MOD*d[y]+2*d[y]*extra2d[IDX]+extra[IDX])%MOD;
  182.             }
  183.            
  184.             ll curr=0;
  185.             //update values of d
  186.             rep(y,1,n+1){
  187.                 curr=(curr+dd[y])%MOD;
  188.                 d[y]=(d[y]+curr)%MOD;
  189.             }
  190.            
  191.            
  192.             // cout<<"debug: "<<endl;
  193.             // rep(y,1,n+1) cout<<arr[y]<<" "; cout<<endl;
  194.             // rep(y,1,n+1) cout<<d[y]<<" "; cout<<endl;
  195.         }
  196.     }
  197.    
  198.     rep(x,0,q) cout<<ans[x]<<endl;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment