codevs1080
单点增加与区间询问
#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef long long ll;
int num[100005];
int ans = 0;
int x, y;
struct node {
int l, r, w;
}tree[400021];
void build(int l, int r, int k)
{
tree[k].l = l;
tree[k].r = r;
if (l == r)
{
cin >> num[l];
tree[k].w = num[l];
return;
}
int m = (l + r) / 2;
build(l, m, k * 2);
build(m + 1, r, k * 2 + 1);
tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}
void add(int k, int x, int A)
{
if (tree[k].l == tree[k].r)
{
tree[k].w += A;
return;
}
int m = (tree[k].r + tree[k].l) / 2;
if (x <= m)add(k * 2, x, A);
else add(2 * k + 1, x, A);
tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}
void sum(int k)
{
if (tree[k].l >= x && tree[k].r <= y)
{
ans += tree[k].w;
return ;
}
int m = (tree[k].l + tree[k].r) / 2;
if (x <= m)sum(k * 2);
if (y > m)sum(k * 2 + 1);
}
int main()
{
int n, m, i;
cin >> n;
build(1, n, 1);
/*
for (i = 1; i<16; i++)
{
cout <<i<<" "<< tree[i].r << " " << tree[i].r << " " << tree[i].w << endl;
}
*/
cin >> m;
while (m--)
{
ans = 0;
int op, A, l, r, index;
cin >> op;
if(op==1)
{
cin >> index >> A;
add(1,index,A);
/*
for (i = 1; i<16; i++)
{
cout <<i<<" "<< tree[i].r << " " << tree[i].r << " " << tree[i].w << endl;
}
*/
}
else if(op==2)
{
cin >> x >> y;
sum(1);
cout << ans << endl;
}
}
system("pause");
return 0;
}
codevs1081
区间增加和单点询问
#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef long long ll;
int num[400021];
int ans = 0;
int x, y, A;
struct node {
int l, r, w;
}tree[400021];
void build(int l, int r, int k)
{
tree[k].l = l;
tree[k].r = r;
if (l == r)
{
cin >> num[l];
tree[k].w = num[l];
return;
}
int m = (l + r) / 2;
build(l, m, k * 2);
build(m + 1, r, k * 2 + 1);
tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}
void add(int k, int x, int A)
{
if (tree[k].l == tree[k].r)
{
tree[k].w += A;
return;
}
int m = (tree[k].r + tree[k].l) / 2;
if (x <= m)add(k * 2, x, A);
else add(2 * k + 1, x, A);
tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}
void ask(int k)
{
if (tree[k].l == tree[k].r)
{
ans = tree[k].w;
return;
}
int m = (tree[k].l + tree[k].r) / 2;
if (x <= m)ask(k * 2);
else ask(k * 2 + 1);
}
void sum(int k)
{
if (tree[k].l >= x && tree[k].r <= y)
{
ans += tree[k].w;
return ;
}
int m = (tree[k].l + tree[k].r) / 2;
if (x <= m)sum(k * 2);
if (y > m)sum(k * 2 + 1);
}
int main()
{
int n, Q, op, i;
cin >> n;
build(1, n, 1);
cin >> Q;
while (Q--)
{
cin >> op;
if (op == 1)
{
cin >> x >> y >> A;
for (i = x; i <= y; i++)
{
add(1, i, A);
}
}
if (op == 2)
{
cin >> x;
ask(1);
cout << ans << endl;
}
}
system("pause");
return 0;
}
codevs1082
区间增加和区间询问
#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef long long ll;
int num[400021];
int ans = 0;
int x, y, A;
struct node {
int l, r, w;
}tree[400021];
void build(int l, int r, int k)
{
tree[k].l = l;
tree[k].r = r;
if (l == r)
{
cin >> num[l];
tree[k].w = num[l];
return;
}
int m = (l + r) / 2;
build(l, m, k * 2);
build(m + 1, r, k * 2 + 1);
tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}
void add(int k, int x, int A)
{
if (tree[k].l == tree[k].r)
{
tree[k].w += A;
return;
}
int m = (tree[k].r + tree[k].l) / 2;
if (x <= m)add(k * 2, x, A);
else add(2 * k + 1, x, A);
tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}
void ask(int k)
{
if (tree[k].l == tree[k].r)
{
ans = tree[k].w;
return;
}
int m = (tree[k].l + tree[k].r) / 2;
if (x <= m)ask(k * 2);
else ask(k * 2 + 1);
}
void sum(int k)
{
if (tree[k].l >= x && tree[k].r <= y)
{
ans += tree[k].w;
return ;
}
int m = (tree[k].l + tree[k].r) / 2;
if (x <= m)sum(k * 2);
if (y > m)sum(k * 2 + 1);
}
int main()
{
int n, Q, op, i;
cin >> n;
build(1, n, 1);
cin >> Q;
while (Q--)
{
cin >> op;
if (op == 1)
{
cin >> x >> y >> A;
for (i = x; i <= y; i++)
{
add(1, i, A);
}
}
if (op == 2)
{
cin >> x >> y;
sum(1);
cout << ans << endl;
}
}
system("pause");
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
int n,q,a[200001];
struct data{
int l,r;
long long sum;
int tag;
}tr[800001];
void build(int k,int s,int t)
{
tr[k].l=s;tr[k].r=t;
if(s==t){tr[k].sum=a[s];return;}
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
void pushdown(int k)
{
int x=tr[k].r-tr[k].l+1;
tr[k<<1].tag+=tr[k].tag;
tr[k<<1|1].tag+=tr[k].tag;
tr[k<<1].sum+=(x-(x>>1))*tr[k].tag;
tr[k<<1|1].sum+=(x>>1)*tr[k].tag;
tr[k].tag=0;
}
void update(int k,int a,int b,int x)
{
int l=tr[k].l,r=tr[k].r;
if(a==l&&r==b)
{
tr[k].tag+=x;
tr[k].sum+=(b-a+1)*x;
return;
}
if(tr[k].tag)pushdown(k);
int mid=(l+r)>>1;
if(b<=mid)update(k<<1,a,b,x);
else if(a>mid)update(k<<1|1,a,b,x);
else
{
update(k<<1,a,mid,x);
update(k<<1|1,mid+1,b,x);
}
tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
long long ask(int k,int a,int b)
{
int l=tr[k].l,r=tr[k].r;
if(a==l&&b==r){return tr[k].sum;}
if(tr[k].tag)pushdown(k);
int mid=(l+r)>>1;
if(b<=mid)return ask(k<<1,a,b);
else if(a>mid)return ask(k<<1|1,a,b);
else return (ask(k<<1,a,mid)+ask(k<<1|1,mid+1,b));
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int t,a,b,x;
scanf("%d",&t);
if(t==1){
scanf("%d%d%d",&a,&b,&x);
update(1,a,b,x);
}
else{
scanf("%d%d",&a,&b);
printf("%lld\n",ask(1,a,b));
}
}
return 0;
}