#define LL long long
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define pri(a) cout << a << endl;
using namespace std;
#define sz 100007
LL a[sz], tr[sz*4], prop[sz*4];
void update(int node, int b, int e, int i, int j, LL val)
{
if(b>=i and e<=j)
{
tr[node] += (e-b+1)*val;
prop[node] += val;
return;
}
int mid=(b+e)>>1;
int lft=node<<1 ,rgt=lft+1;
if(j<=mid) update(lft,b,mid,i,j,val);
else if(i>mid) update(rgt,mid+1,e,i,j,val);
else
{
update(lft,b,mid,i,j,val);
update(rgt,mid+1,e,i,j,val);
}
tr[node] = tr[lft] + tr[rgt] + prop[node]*(e-b+1);
}
LL query(int node, int b, int e, int i, int j, LL car)
{
if(b>=i and e<=j)
{
return tr[node]+car*(e-b+1);
}
int mid = (b+e)>>1;
int lft = node<<1, rgt = lft+1;
if(j<=mid) query(lft,b,mid,i,j,car+prop[node]);
else if(i>mid) query(rgt,mid+1,e,i,j,car+prop[node]);
else
{
return (query(lft,b,mid,i,j,car+prop[node]) + query(rgt,mid+1,e,i,j,car+prop[node]));
}
}
int main()
{
// freopen("F:\out.txt", "w", stdout);
int n,qu,T,op,p,q,v,cs=0;
scanf("%d",&T);
while(T--)
{
memset(tr, 0, sizeof tr);
memset(prop, 0, sizeof prop);
// printf("Case %d:\n",++cs);
scanf("%d%d",&n,&qu);
REP(i,qu)
{
scanf("%d", &op);
if(op==0)
{
scanf("%d%d%d",&p,&q,&v);
p--,q--;
update(1,0,n-1,p,q,v);
}
else if(op==1)
{
scanf("%d%d",&p,&q);
p--,q--;
LL res = query(1,0,n-1,p,q,0);
printf("%lld\n", res);
}
}
}
return 0;
}
No comments:
Post a Comment