记录编号 |
452413 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016] 数列操作d |
最终得分 |
100 |
用户昵称 |
CSU_Turkey |
是否通过 |
通过 |
代码语言 |
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;
}