线段树(区间求和):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int num[233333];
struct qer
{
int l, r;
ll sum, add;
}tree[233333*4];
void spread(int p)
{
if (tree[p].add)
{
tree[p*2].sum += (ll)(tree[p*2].r - tree[p*2].l + 1)*tree[p].add;
tree[p*2+1].sum += (ll)(tree[p*2+1].r - tree[p*2+1].l + 1)*tree[p].add;
tree[p*2].add += tree[p].add;
tree[p*2+1].add += tree[p].add;
tree[p].add = 0;
}
}
void build(int p, int l, int r)
{
tree[p].l = l;
tree[p].r = r;
if (l == r)
{
tree[p].sum = num[l];
return ;
}
spread(p);
int mid = (l+r)/2;
build(p*2, l, mid);
build(p*2+1, mid+1, r);
tree[p].sum = tree[p*2].sum + tree[p*2+1].sum;
}
void change(int p, int l, int r, ll x)
{
if (l <= tree[p].l && tree[p].r <= r)
{
tree[p].sum += (ll)(tree[p].r - tree[p].l + 1)*x;
tree[p].add += x;
return ;
}
spread(p);
int mid = (tree[p].l + tree[p].r)/2;
if(l <= mid) change(p*2, l, r, x);
if(r > mid) change(p*2+1, l, r, x);
tree[p].sum = tree[p*2].sum + tree[p*2+1].sum;
}
ll ask(int p, int l, int r)
{
if (l <= tree[p].l && tree[p].r <= r)
{
return tree[p].sum;
}
spread(p);
ll ans = 0;
int mid = (tree[p].l + tree[p].r)/2;
if(l <= mid) ans += ask(p*2, l, r);
if(r > mid) ans += ask(p*2+1, l, r);
return ans;
}
int main()
{
int n;
cin>>n;
for (int i = 1; i <= n; i++)
scanf("%d", &num[i]);
build(1, 1, n);
int m;
cin>>m;
for (int i = 1; i <= m; i++)
{
int x;
scanf("%d", &x);
if(x == 1)
{
int a, c;
ll b;
scanf("%d%d%lld", &a, &c, &b);
change(1, a, c, b);
}
else
{
int a, b;
scanf("%d%d", &a, &b);
printf("%lld\n", ask(1, a, b));
}
}
return 0;
}
树状数组:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
const int MAXN=100000+10;
int tree[MAXN],c[MAXN],a[MAXN];
int n;
void add(int x,int y)
{
while(x<=n)
{
tree[x]+=y;
x+=lowbit(x);
}
}
int sum(int x)
{
int ans=0;
while(x)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
c[i]=a[i]-a[i-1];
add(i,c[i]);
}
int q;scanf("%d",&q);
while(q--)
{
int t,l,r,s;
scanf("%d",&t);
if(t==1)
{
scanf("%d%d%d",&l,&r,&s);
add(l,s);
add(r+1,-s);
}
if(t==2)
{
int pos;
scanf("%d",&pos);
printf("%d\n",sum(pos));
}
}
return 0;
}