记录编号 | 452413 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [HZOI 2016] 数列操作d | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 6.537 s | ||
提交时间 | 2017-09-19 15:47:44 | 内存使用 | 27.78 MiB | ||
#include<bits/stdc++.h> #define ll long long #define ls o<<1 #define rs o<<1|1 #define mid ((r+l)>>1) using namespace std; const int mod=1e9+7; const int max_n=300005; ll read(){ char ch=getchar(); ll a=0; while(!(ch<='9'&&ch>='0'))ch=getchar(); while(ch<='9'&&ch>='0'){ a=(a<<1)+(a<<3)+(ch^'0'); ch=getchar(); } return a; } ll n,m,f[max_n<<2],lazy1[max_n<<2],lazy2[max_n<<2]; void push_down(ll l,ll r,ll o){ lazy1[ls]+=lazy1[o];lazy2[ls]+=lazy2[o]; lazy1[rs]+=lazy1[o];lazy2[rs]+=lazy2[o]; lazy1[o]=0;lazy2[o]=0; } void update(ll l,ll r,ll o){ ll tem1=(((l+mid)*(mid-l+1))/2*lazy1[ls]%mod-(lazy2[ls])*(mid-l+1)%mod+mod+f[ls]); ll tem2=(((mid+1+r)*(r-mid))/2*lazy1[rs]%mod-(lazy2[rs])*(r-mid)%mod+mod+f[rs]); f[o]=tem1+tem2; f[o]%=mod; } void change1(ll l,ll r,ll o,ll L,ll R,ll x){ if(l>=L&&r<=R){ lazy1[o]+=x; return ; }push_down(l,r,o); if(mid>=L)change1(l,mid,ls,L,R,x); if(mid<R)change1(mid+1,r,rs,L,R,x); update(l,r,o); } void change2(ll l,ll r,ll o,ll L,ll R,ll x){ if(l>=L&&r<=R){ lazy2[o]+=x; return ; }push_down(l,r,o); if(mid>=L)change2(l,mid,ls,L,R,x); if(mid<R)change2(mid+1,r,rs,L,R,x); update(l,r,o); } ll q(ll l,ll r,ll o,ll L,ll R){ if(l>=L&&r<=R){ return (((l+r)*(r-l+1))/2*lazy1[o]%mod-lazy2[o]*(r-l+1)%mod+mod+f[o])%mod; }push_down(l,r,o); ll k=0; if(mid>=L)k+=q(l,mid,ls,L,R); if(mid<R)k+=q(mid+1,r,rs,L,R); update(l,r,o); return k%mod; } int main() { freopen("segment.in","r",stdin); freopen("segment.out","w",stdout); // freopen("1.txt","r",stdin); n=read();m=read(); for(int i=1;i<=m;i++){ ll p,L,R,x; p=read();L=read();R=read(); if(p==1){ x=read(); change1(1,n,1,L,R,x); change2(1,n,1,L,R,x*L%mod); } else { printf("%lld\n",q(1,n,1,L,R)); } } return 0; }