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;
}