您的位置:首页 > 其它

线段树模板

2017-08-12 08:13 363 查看
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
long long i,j,m,n,b[500001];
long long x,y,ord,k;
struct data
{
long long aa,bb;
long long val;
long long sign;
}a[2000001];

long long r()
{
long long aans=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
aans*=10;
aans+=ch-'0';
ch=getchar();
}
return aans*f;
}

void build(long long l,long long r,long long root)
{
if(l==r)
{
a[root].aa=a[root].bb=l;
a[root].val=b[l];
return;
}

build(l,(l+r)/2,root*2);
build(1+(l+r)/2,r,root*2+1);
a[root].aa=l;
a[root].bb=r;
a[root].val=a[root*2].val+a[root*2+1].val;
}

void pushdown(long long root)
{
if(a[root].sign!=0)
{
a[root*2].val+=(a[root*2].bb-a[root*2].aa+1)*a[root].sign;
a[root*2+1].val+=(a[root*2+1].bb-a[root*2+1].aa+1)*a[root].sign;
a[root*2].sign+=a[root].sign;
a[root*2+1].sign+=a[root].sign;
a[root].sign=0;
}
}

void update(long long root,long long ul,long long ur,long long add)
{
if(ul<=a[root].aa&&ur>=a[root].bb)
{
a[root].sign+=add;
a[root].val+=(a[root].bb-a[root].aa+1)*add;
return;
}
pushdown(root);
long long mid=(a[root].aa+a[root].bb)/2;
if(ul<=mid) update(root*2,ul,ur,add);
if(ur>mid) update(root*2+1,ul,ur,add);
a[root].val=a[root*2+1].val+a[root*2].val;
}

long long ask(long long nl,long long nr,long long root)
{
if(nl<=a[root].aa&&nr>=a[root].bb)
return a[root].val;
int mid=a[root].aa+a[root].bb;
mid/=2;
pushdown(root);
long long ANS=0;
if(nl<=mid)
ANS+=ask(nl,nr,root*2);
if(nr>mid)
ANS+=ask(nl,nr,root*2+1);
return ANS;
}

int main()
{
n=r(),m=r();
for(i=1;i<=n;i++)
b[i]=r();
build(1,n,1);
for(i=1;i<=m;i++)
{
ord=r(),x=r(),y=r();
if(ord==1)
{
update(1,x,x,y);
}
else
{
cout<<ask(x,y,1)<<endl;
}
}

}
/*
5 2
1 2 3 4 5
1 1 5 2
2 2 4
*/


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: