不可以这样造数据!

P3374 【模板】树状数组 1


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


|