记录编号 |
501135 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016] 数列操作d |
最终得分 |
100 |
用户昵称 |
_Itachi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.577 s |
提交时间 |
2018-07-19 15:33:32 |
内存使用 |
73.53 MiB |
显示代码纯文本
//
// shulied.cpp
//
//
// Created by apple on 2018/7/19.
//
#include <stdio.h>
#include <algorithm>
using namespace std;
#define LL long long
const int maxn=300005<<3,INF=1000*1000*1000+7;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
int n,m,s,t;LL sum[maxn],a1[maxn],a2[maxn],qx,L,c[maxn];
void Add(int rt,int l,int r){
if(s<=l&&r<=t){
a1[rt]=(a1[rt]+qx*L%INF)%INF,a2[rt]=(a2[rt]+qx)%INF;
c[rt]=(a1[rt]*(r-l+1)%INF+a2[rt]*(sum[r]-sum[l-1]+INF)%INF+c[ls]+c[rs])%INF;
return;
}
if(s<=mid)Add(ls,l,mid);
if(t> mid)Add(rs,mid+1,r);
c[rt]=(a1[rt]*(r-l+1)%INF+a2[rt]*(sum[r]-sum[l-1]+INF)%INF+c[ls]+c[rs])%INF;
}
LL Sum(int rt,int l,int r){
if(s<=l&&r<=t)return c[rt];
int ll=max(s,l),rr=min(t,r);
LL res=(a1[rt]*(rr-ll+1)%INF+a2[rt]*(sum[rr]-sum[ll-1]+INF)%INF)%INF;
if(s<=mid)res=(res+Sum(ls,l,mid))%INF;
if(t> mid)res=(res+Sum(rs,mid+1,r))%INF;
return res;
}
int main(){
freopen("segment.in","r",stdin);freopen("segment.out","w",stdout);
scanf("%d%d",&n,&m);int i,o;
for(i=1;i<=n;i++)sum[i]=(sum[i-1]+i)%INF;
while(m--){
scanf("%d%d%d",&o,&s,&t);
if(o)scanf("%lld",&qx),L=INF-s,Add(1,1,n);
else printf("%lld\n",Sum(1,1,n));
}
}