?
by FL_sleake @ 2024-03-14 19:44:18
edr?
by FXLIR @ 2024-03-14 19:44:54
大佬,帮忙调一下呗 @[anke2017](/user/1076971)
同一题
```cpp
#include <iostream>
using namespace std;
const int MAX_LEN = 1e6 + 1;
void Build_Tree(int a[], int tree[], int node, int start, int end)
{
if (start == end)
{
tree[node] = a[start];
return;
}
int mid = (start + end) / 2;
int left_node = node << 1;
int right_node = (node << 1) | 1;
Build_Tree(a, tree, left_node, start, mid);
Build_Tree(a, tree, right_node, mid + 1, end);
tree[node] = tree[left_node] + tree[right_node];
}
void Update_Tree(int a[], int tree[], int node, int start, int end, int idx, int val)
{
if (start == end)
{
a[idx] += val;
tree[node] += val;
return;
}
int mid = (start + end) / 2;
int left_node = node << 1;
int right_node = (node << 1) | 1;
if (idx < mid)
Update_Tree(a, tree, left_node, start, mid, idx, val);
else
Update_Tree(a, tree, right_node, mid + 1, end, idx, val);
tree[node] = tree[left_node] + tree[right_node];
}
int Query_Tree(int a[], int tree[], int node, int start, int end, int l, int r)
{
if (end < l || start > r)
return 0;
else if (l <= start && end <= r)
return tree[node];
int mid = (start + end) / 2;
int left_node = node << 1;
int right_node = (node << 1) | 1;
return Query_Tree(a, tree, left_node, start, mid, l, r) +
Query_Tree(a, tree, right_node, mid + 1, end, l, r);
}
int main()
{
int n, m, a[MAX_LEN], tree[MAX_LEN];
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> a[i];
Build_Tree(a, tree, 1, 1, n);
// for (int i = 1; i <= 15; ++i)
// cout << "tree[" << i << "] = " << tree[i] << endl;
for (int i = 1; i <= m; ++i)
{
int flag;
cin >> flag;
if (flag & 1)
{
int idx, val;
cin >> idx >> val;
Update_Tree(a, tree, 1, 1, n, idx, val);
// for (int i = 1; i <= 15; ++i)
// cout << "tree[" << i << "] = " << tree[i] << endl;
}
else
{
int l, r;
cin >> l >> r;
cout << Query_Tree(a, tree, 1, 1, n, l, r) << endl;
}
}
}
```
by ldh270657080 @ 2024-03-14 19:47:20
```cpp
#include<iostream>
#include<cstdio>
using namespace std;
const int inf=5e5;
int n[inf],tree[4*inf];
int lson(int n){return 2*n;}
int rson(int n){return 2*n+1;}
int maxn(int a,int b)
{
return a>b?a:b;
}
int btree(int a,int lft,int rgt)
{
if(lft==rgt){return tree[a]=n[lft];}
int mid=(lft+rgt)>>1;
int l=btree(lson(a),lft,mid);
int r=btree(rson(a),mid+1,rgt);
return tree[a]=l+r;
}
int ask(int a,int lft,int rgt,int ll,int lr)
{
if(ll<=lft&&rgt<=lr)return tree[a];
int mid=(lft+rgt)>>1;
int n=0;
if(ll<=mid)n=ask(lson(a),lft,mid,ll,lr);
if(lr>mid)n+=ask(rson(a),mid+1,rgt,ll,lr);
return n;
}
int find(int n,int st,int ed,int now)
{
if(st==ed)return now;
int mid=(st+ed)>>1;
if(n>mid)return find(n,mid+1,ed,rson(now));
else return find(n,st,mid,lson(now));
}
void change(int a,int b,int c)
{
int t=find(a,1,c,1);
while(t)
{
tree[t]+=b;
t/=2;
}
}
int main()
{
int a,b;
cin>>a;
cin>>b;
for(int j=1;j<=a;j++)
{
scanf("%d",&n[j]);
}
btree(1,1,b);
for(int j=1;j<=b;j++)
{
int t;
int t1,t2;
cin>>t>>t1;
cin>>t2;
if(t==2){cout<<ask(1,1,b,t1,t2)<<endl;}
else {
change(t1,t2,b);
}
}
return 0;
}
```
by anke2017 @ 2024-03-14 19:49:53
提供一组hack(((
```
5 1
1 5 4 2 3
2 1 5
```
by QWQ_123 @ 2024-03-14 20:08:15
@[anke2017](/user/1076971) [类似的事情在正赛中也有发生](https://www.luogu.com.cn/discuss/723875)
by FFTotoro @ 2024-03-14 21:12:44