newmap @ 2024-04-04 18:33:32
#include<bits/stdc++.h>
using namespace std;
using ll=unsigned long long;
ll a[100001];
struct segmentTree
{
vector<int> node,tag;
ll ls(ll p){return p<<1;}
ll rs(ll p){return (p<<1)+1;}
segmentTree(ll n)
{
node.resize(n<<2+1);
tag.resize(n<<2+1);
}
void build(ll l,ll r,ll p)
{
if(l==r)
{
cin>>node[p];
return;
}
ll mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
node[p]=node[ls(p)]+node[rs(p)];
}
void pass(ll l,ll r,ll p,ll k)
{
tag[p]+=k;
node[p]+=k*(r-l+1);
}
void pass_tag(ll l,ll r,ll p)
{
if(tag[p])
{
ll mid=(l+r)>>1;
pass(l,mid,ls(p),tag[p]);
pass(mid+1,r,rs(p),tag[p]);
tag[p]=0;
}
}
void update(ll upl,ll upr,ll k,ll l,ll r,ll p)
{
if(upl<=l && r<=upr)
{
node[p]+=k*(r-l+1);
tag[p]+=k;
return;
}
pass_tag(l,r,p);
ll mid=(l+r)>>1;
if(upl<=mid)update(upl,upr,k,l,mid,ls(p));
if(mid<upr)update(upl,upr,k,mid+1,r,rs(p));
node[p]=node[ls(p)]+node[rs(p)];
}
ll query(ll ql,ll qr,ll l,ll r,ll p)
{
if(ql<=l && r<=qr)return node[p];
ll res=0,mid=(r+l)>>1;
pass_tag(l,r,p);
if(ql<=mid)res+=query(ql,qr,l,mid,ls(p));
if(mid<qr)res+=query(ql,qr,mid+1,r,rs(p));
return res;
}
};
int main()
{
std::ios::sync_with_stdio(false);
ll n,m;
cin>>n>>m;
segmentTree j(n);
j.build(1,n,1);
for(int i=0;i<m;i++)
{
ll op,l,r,k;
cin>>op;
if(op==1)
{
cin>>l>>r>>k;
j.update(l,r,k,1,n,1);
}else if(op==2)
{
cin>>l>>r;
cout<<j.query(l,r,1,n,1)<<endl;
}
}
system("pause");
}
by Simple_Stardust @ 2024-04-14 21:16:06
@newmap vector<int> node,tag; 这里应该修改为 vector<long long> node,tag; 这里的值会超过int的大小的