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