社区讨论
蒟蒻爆零求助qaq
P3372【模板】线段树 1参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lobfcp0v
- 此快照首次捕获于
- 2023/10/29 20:05 2 年前
- 此快照最后确认于
- 2023/11/04 01:37 2 年前
rt
CPP#include<bits/stdc++.h>
#define ll long long
//#include<conio.h>
//#include<windows.h>
using namespace std;
const int MAXN=1000005;
ll arr[MAXN],tree[MAXN<<2],tag[MAXN<<2];
inline ll ls(ll x)
{
return x<<1;
}
inline ll rs(ll x)
{
return x<<1|1;
}
inline void push_back(ll p)
{
tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll l,ll r,ll p)
{
if(l==r)
{
tree[p]=arr[l];
return;
}
ll mid=l+r>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_back(p);
}
inline void push__down(ll l,ll r,ll p,ll k)
{
tag[p]+=k;
tree[p]+=(r-l+1)*k;
}
inline void push_down(ll l,ll r,ll p)
{
ll mid=l+r>>1;
push__down(l,mid,ls(p),tag[p]);
push__down(mid+1,r,rs(p),tag[p]);
tag[p]=0;
}
inline void res(ll l_,ll r_,ll l,ll r,ll p,ll k)
{
if(l_<=l&&r<=r_)
{
tree[p]+=(r-l+1)*k;
tag[p]+=k;
return;
}
ll mid=l+r>>1;
push_down(l,r,p);
if(l_<=mid)
res(l_,r_,l,mid,ls(p),k);
if(r_>mid)
res(l_,r_,mid+1,r,rs(p),k);
push_back(p);
}
ll que(ll l_,ll r_,ll l,ll r,ll p)
{
if(l_<=l&&r<=r_)
return tree[p];
ll ans=0;
ll mid=l+r>>1;
push_down(l,r,p);
if(l_<=mid)
ans+=que(l_,r_,l,mid,ls(p));
if(r_>mid)
ans+=que(l_,r_,mid+1,r,rs(p));
return ans;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&arr[i]);
build(1,1,n);
while(m--)
{
int tmp;
scanf("%d",&tmp);
switch(tmp)
{
case 1:
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
res(a,b,1,n,1,c);
break;
default:
ll a,b;
scanf("%lld%lld",&a,&b);
printf("%lld\n",que(a,b,1,n,1));
break;
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...