poj3468
线段树入门题#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<cstdlib>#include<cstring>#include<string>#include<map>#...
·
线段树入门题
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
const int maxn=1e5+5;
struct node
{
ll val,addition;
int left,right,lazy;
}tree[4*maxn];
void build(int L,int R,int num)
{
tree[num].left=L;
tree[num].right=R;
tree[num].lazy=0;
tree[num].addition=0;
int mid=(L+R)/2;
if(L==R)
{
scanf("%lld",&tree[num].val);
return ;
}
build(L, mid,2*num);
build(mid+1,R,2*num+1);
tree[num].val=tree[2*num].val+tree[2*num+1].val;
}
void pushdown(int num)
{
if(tree[num].lazy)
{
tree[num].lazy=0;
tree[2*num].addition+=tree[num].addition;
tree[2*num].val+=tree[num].addition*(tree[2*num].right-tree[2*num].left+1);
tree[2*num].lazy=1;
tree[2*num+1].addition+=tree[num].addition;
tree[2*num+1].val+=tree[num].addition*(tree[2*num+1].right-tree[2*num+1].left+1);
tree[2*num+1].lazy=1;
tree[num].addition=0;
}
}
void update(int l,int r,ll v,int num)
{
if(tree[num].left>=l&&r>=tree[num].right)
{
tree[num].addition+=v;
tree[num].val+=v*(tree[num].right-tree[num].left+1);
tree[num].lazy=1;
return;
}
pushdown(num);
int mid=(tree[num].left+tree[num].right)/2;
if(l<=mid)update(l,r,v,2*num);
if(r>mid)update(l,r,v,2*num+1);
tree[num].val=tree[num*2].val+tree[num*2+1].val;
}
ll query(int l,int r,int num)
{
ll ans=0;
if(tree[num].left>=l&&tree[num].right<=r)
{
return tree[num].val;
}
pushdown(num);
int mid=(tree[num].left+tree[num].right)/2;
if(l<=mid)ans+=query(l,r,2*num);
if(r>mid)ans+=query(l,r,2*num+1);
return ans;
}
int main()
{
// std::ios::sync_with_stdio(false);
int n,q,i,l,r;
ll v;
char sta;
cin>>n>>q;
build(1,n,1);
for(i=0;i<q;i++)
{
scanf(" %c",&sta);
if(sta=='Q')
{
scanf("%d %d",&l,&r);
printf("%lld\n",query(l,r,1));
}
else
{
scanf("%d %d %lld",&l,&r,&v);
update(l,r,v,1);
}
}
return 0;
}
更多推荐
已为社区贡献2条内容
所有评论(0)