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