点击->大牛详解
模板题目链接:
单点修改,单点查询codevs1080 线段树练习
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m;
int c[500005];
int lowbit(int x)
{
return (-x)&x;
}
void add(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
}
void input()
{
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
add(i,x);
}
}
int query(int i)
{
int res=0;
while(i>0)
{
res+=c[i];
i-=lowbit(i);
}
return res;
}
int main()
{
scanf("%d%d",&n,&m);
input();
int f,x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&f,&x,&y);
if(f==1)
add(x,y);
else if(f==2)
cout<<query(y)-query(x-1)<<endl;
}
return 0;
}
区间修改,单点查询codevs1081 线段树练习2
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int c[500005];
int n,m;
int lowbit(int x)
{
return x&(-x);
}
void add(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
}
int query(int i)
{
int res=0;
while(i>0)
{
res+=c[i];
i-=lowbit(i);
}
return res;
}
int main()
{
scanf("%d%d",&n,&m);
int x=0,y;
for(int i=1;i<=n;i++)
{
scanf("%d",&y);
add(i,y-x);
x=y;
}
int opt,k;
for(int i=1;i<=m;i++)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&x,&y,&k);
add(x,k);
add(y+1,-k);
}
else
{
scanf("%d",&x);
printf("%d\n",query(x));
}
}
return 0;
}
区间修改,区间查询codevs1082 线段树练习3
#include<iostream>
#include<cstdio>
using namespace std;
long long c[220000][3];
int n,a[220000];
int lowbit(int x)
{
return x&(-x);
}
void update(int i,int flag,int val)
{
while(i<=n)
{
c[i][flag]+=val;
i+=lowbit(i);
}
}
long long add(int i,int flag)
{
long long ans=0;
while(i>0)
{
ans+=c[i][flag];
i-=lowbit(i);
}
return ans;
}
long long ans(int x)
{
long long res=(x+1)*add(x,0)-add(x,1);
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
update(i,0,a[i]-a[i-1]);
update(i,1,(a[i]-a[i-1])*i);
}
int m;
scanf("%d",&m);
while(m--)
{
int z;
scanf("%d",&z);
if(z==1)
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
update(l,0,v);
update(r+1,0,-v);
update(l,1,l*v);
update(r+1,1,-(r+1)*v);
}
else
{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",ans(r)-ans(l-1));
}
}
return 0;
}