记录编号 421811 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016] 数列操作d 最终得分 100
用户昵称 Gravatarztx 是否通过 通过
代码语言 C++ 运行时间 0.671 s
提交时间 2017-07-08 10:19:18 内存使用 3.75 MiB
显示代码纯文本
/// by ztx
/// blog.csdn.net/hzoi_ztx
#include <bits/stdc++.h>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define rep(i,l,r) for(i=(l);i< (r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
#define rev(i,r,l) for(i=(r);i> (l);i--)
#define Each(i,v)  for(i=v.begin();i!=v.end();i++)
#define r(x)   read(x)
typedef long long ll ;
typedef double lf ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
    ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
    if (CH == '-') NEG = true , CH = getchar() ;
    while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
    if (NEG) ret = -ret ;
}

#define  kN   300010LL
#define  mod  1000000007LL
#define  half 500000004LL
#define  lb   (p&(-p))

int n, A[kN], B[kN], C[kN];

inline void Delta(int p,int w,int c[kN]) {
    for (;p<=n;p+=lb) (c[p] += w) %= mod;
}

inline int Sum(int p,int c[kN]) {
    int ret = 0;
    for (;p;p-=lb) (ret += c[p]) %= mod;
    return ret;
}

inline int Sum(int p) {
    return (1LL*Sum(p,A)*p%mod*p%mod+1LL*Sum(p,B)*p%mod+1LL*Sum(p,C)%mod)%mod;
}

inline void Modify(int L,int R,ll x) {
    x = x*half%mod;
    Delta(L,x,A);
    Delta(L,x*(1LL-2*L)%mod,B);
    Delta(L,x*L%mod*(L-1)%mod,C);
    Delta(R+1,-x,A);
    Delta(R+1,-x*(1LL-2*L)%mod,B);
    Delta(R+1,(-x*L%mod*(L-1)%mod + x*(R-L)%mod*(R-L+1)%mod)%mod,C);
}

inline void Query(int L,int R) {
    printf("%lld\n", ((1LL*Sum(R)-Sum(L-1))%mod+mod)%mod);
}

int main() {
    freopen("segment.in","r",stdin);
    freopen("segment.out","w",stdout);
    int m, L, R, x;
    r(n), r(m);
    while (m --> 0) {
        r(L);
        if (L)
            r(L), r(R), r(x),
            Modify(L,R,x);
        else
            r(L), r(R),
            Query(L,R);
    }
    END: getchar(), getchar();
    return 0;
}