Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Super Idol的笑容
- // 都没你的甜
- // 八月正午的阳光
- // 都没你耀眼
- // 热爱105°C的你
- // 滴滴清纯的蒸馏水
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- #include <ext/rope>
- using namespace std;
- using namespace __gnu_pbds;
- using namespace __gnu_cxx;
- #define ll long long
- #define ii pair<ll,ll>
- #define iii pair<ii,ll>
- #define fi first
- #define se second
- #define endl '\n'
- #define debug(x) cout << #x << ": " << x << endl
- #define pub push_back
- #define pob pop_back
- #define puf push_front
- #define pof pop_front
- #define lb lower_bound
- #define ub upper_bound
- #define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
- #define all(x) (x).begin(),(x).end()
- #define sz(x) (int)(x).size()
- #define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
- //change less to less_equal for non distinct pbds, but erase will bug
- mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
- const int MOD=1000000007;
- ll fix(ll i){
- i%=MOD;
- if (i<0) i+=MOD;
- return i;
- }
- const ll BUC=250;
- ll n,m,q;
- ll arr[50005];
- ll d[50005];
- ll dd[50005];
- ll prefarr[50005];
- ll prefd2[50005];
- ll prefd[50005];
- ll extra[50005];
- ll extra2d[50005];
- ll sum[50005];
- struct U{
- ll l,r;
- ll v;
- };
- U upd[50005];
- ll pos(ll x){
- return (x-1)%BUC+1;
- }
- vector<ll> disc;
- struct Q{
- ll l,r;
- ll v;
- ll idx;
- };
- vector<Q> qu[50005];
- ll ans[50005];
- int main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cin.exceptions(ios::badbit | ios::failbit);
- cin>>n>>m>>q;
- rep(x,1,n+1) cin>>d[x];
- rep(x,1,n+1) d[x]=(d[x]+MOD)%MOD;
- rep(x,1,n+1) arr[x]=d[x]*d[x]%MOD;
- ll A,B,C,D;
- rep(x,1,m+1){
- cin>>A>>B>>C;
- upd[x]={A,B,(C+MOD)%MOD};
- }
- rep(x,0,q){
- cin>>A>>B>>C>>D;
- if (C) qu[C-1].pub({A,B,-1,x});
- qu[D].pub({A,B,1,x});
- }
- rep(x,1,n+1) prefarr[x]=(prefarr[x-1]+arr[x])%MOD;
- for (auto &it:qu[0]){
- ans[it.idx]=fix(ans[it.idx]+it.v*(prefarr[it.r]-prefarr[it.l-1]));
- }
- rep(x,1,m+1){
- if (x%BUC==1){
- disc={1};
- rep(y,x,min(x+BUC,m+1)){
- disc.pub(upd[y].l);
- if (upd[y].r!=n) disc.pub(upd[y].r+1);
- }
- sort(all(disc));
- disc.erase(unique(all(disc)),disc.end());
- // cout<<"debug disc: "<<x<<endl;
- // for (auto &it:disc) cout<<it<<" "; cout<<endl;
- rep(x,1,n+1){
- prefarr[x]=(prefarr[x-1]+arr[x])%MOD;
- prefd2[x]=(prefd2[x-1]+d[x]*d[x])%MOD;
- prefd[x]=(prefd[x-1]+d[x])%MOD;
- }
- disc.pub(n+1);
- rep(x,0,sz(disc)-1){
- extra[x]=extra2d[x]=sum[x]=0;
- }
- rep(x,1,n+1) dd[x]=0;
- }
- rep(y,0,sz(disc)-1) if (upd[x].l<=disc[y] && disc[y]<=upd[x].r){
- sum[y]=(sum[y]+upd[x].v)%MOD;
- }
- rep(y,0,sz(disc)-1){
- extra[y]=(extra[y]+sum[y]*sum[y])%MOD;
- extra2d[y]=(extra2d[y]+sum[y])%MOD;
- }
- // cout<<"current prefix sums: "<<endl;
- // int IDX=0;
- // rep(y,1,n+1){
- // if (disc[IDX+1]==y) IDX++;
- // cout<<(arr[y]+pos(x)*d[y]%MOD*d[y]+2*d[y]*extra2d[IDX]+extra[IDX])%MOD<<" ";
- // } cout<<endl;
- for (auto &it:qu[x]){
- ans[it.idx]=fix(ans[it.idx]+
- it.v*(prefarr[it.r]-prefarr[it.l-1]+pos(x)*(prefd2[it.r]-prefd2[it.l-1])));
- rep(y,0,sz(disc)-1){
- int r=min(it.r,disc[y+1]-1),l=max(it.l,disc[y])-1;
- if (l>=r) continue;
- ans[it.idx]=fix(ans[it.idx]+
- it.v*(2*(prefd[r]-prefd[l])*extra2d[y]+(r-l)*extra[y]));
- }
- // cout<<"debug: "<<it.idx<<endl;
- // cout<<ans[it.idx]<<endl;
- }
- dd[upd[x].l]=fix(dd[upd[x].l]+upd[x].v);
- dd[upd[x].r+1]=fix(dd[upd[x].r+1]-upd[x].v);
- if (x%BUC==0){
- int IDX=0;
- rep(y,1,n+1){
- if (disc[IDX+1]==y) IDX++;
- arr[y]=(arr[y]+pos(x)*d[y]%MOD*d[y]+2*d[y]*extra2d[IDX]+extra[IDX])%MOD;
- }
- ll curr=0;
- //update values of d
- rep(y,1,n+1){
- curr=(curr+dd[y])%MOD;
- d[y]=(d[y]+curr)%MOD;
- }
- // cout<<"debug: "<<endl;
- // rep(y,1,n+1) cout<<arr[y]<<" "; cout<<endl;
- // rep(y,1,n+1) cout<<d[y]<<" "; cout<<endl;
- }
- }
- rep(x,0,q) cout<<ans[x]<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment