线段树写法:
/*
作者:Greetrix
题目:p1081 线段树练习 2
*/
/*
codevs 线段树练习2,区间修改;
program:sum;
*/
#include<iostream>
#include<cstdlib>
using namespace std;
const int M=100005;
struct Seb_tree
{
int l;
int r;
long long sum;
int col;
};
Seb_tree t[M*4+1];
int s[M];
int n, m;
void push_down(int k)
{
if (t[k].col)
{
int lson=k*2;
int rson=lson+1;
t[lson].sum+=(t[lson].r-t[lson].l+1)*t[k].col;
t[lson].col+=t[k].col;
t[rson].sum+=(t[rson].r-t[rson].l+1)*t[k].col;
t[rson].col+=t[k].col;
t[k].col=0;
}
}
long long query(int i, int k)
{
if (t[k].l==t[k].r&& t[k].l==i) return t[k].sum;
int mid=(t[k].l+t[k].r)/2;
push_down(k);
if (i>mid) query(i, k*2+1);
else query(i, k*2);
}
void updata(int l, int r, int col, int k)
{
if (t[k].l>=l && t[k].r<=r)
{
t[k].sum+=(t[k].r-t[k].l+1)*col;
t[k].col+=col;
return;
}
push_down(k);
int mid=(t[k].l+t[k].r)/2;
if (r<=mid) updata(l ,r, col, k*2);
else if (l>mid) updata(l, r, col, k*2+1);
else
{
updata(l ,mid,col, k*2);
updata(mid+1, r, col, k*2+1);
}
t[k].sum=t[k*2].sum+t[k*2+1].sum;
}
void build(int l, int r, int k)
{
t[k].l=l;
t[k].r=r;
t[k].col=0;
if (l==r) t[k].sum=s[r];
else
{
int mid=(l+r)/2;
build(l ,mid, k*2);
build(mid+1, r, k*2+1);
t[k].sum=t[k*2].sum+t[k*2+1].sum;
}
}
void debug()
{
for (int i=1; i<=n*2+1; i++) cout<<t[i].sum<<" ";
cout<<endl;
}
int main()
{
cin>>n;
for (int i=1; i<=n; i++) cin>>s[i];
build(1, n, 1);
//debug();
cin>>m;
while (m--)
{
int a, b, c, d;
cin>>a;
if (a==1)
{
cin>>b>>c>>d;
updata(b, c, d, 1);
}
else
{
cin>>b;
cout<<query(b, 1)<<endl;
}
}
return 0;
}
树状数组写法:
/*
作者:Cyxgrtx
题目:p1081 线段树练习 2
*/
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define For1(x,n) for(int i=x; i<=n; i++)
using namespace std;
const int M=100010;
int a[M];
int d[M];
int c[M];
int n, m;
int low_bit(int x) { return x & (x ^ (x-1));}
void debug()
{
For1(1,n) printf("%d ", c[i]);
printf("\n");
}
void updata(int i, int val)
{
while (i<=n)
{
c[i]+=val;
i+=low_bit(i);
}
}
int query(int i)
{
int sum=0;
while (i>0)
{
sum+=c[i];
i-=low_bit(i);
}
return sum;
}
void init()
{
memset(d, 0, sizeof(d));
memset(c, 0, sizeof(c));
memset(a,0,sizeof(a));
scanf("%d", &n);
For1(1,n) scanf("%d ",&a[i]);
a[0]=0;
For1(1,n) updata(i,a[i]-a[i-1]);
}
void solve()
{
scanf("%d",&m);
For1(1,m)
{
int q, l, r, val;
scanf("%d", &q);
if (q==1)
{
scanf("%d %d %d", &l, &r, &val);
updata(l,val);
updata(r+1,-val);
}
else
{
int sum=0;
scanf("%d", &val);
sum=query(val);
printf("%d\n", sum);
}
}
}
int main()
{
init();
solve();
return 0;
}