J题 树状数组WA
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int n,a[N],c[N],q,l,r,op;
int lowbit(int i){
return (-i)&i;
}
void add(int i,int z){//数组的第i个值更新了
for(;i<=n;i+=lowbit(i)) c[i]+=z;
}
int sum(int i){//计算i之前的前缀和
int s=0;
for(;i>0;i-=lowbit(i)) s+=c[i];
return s;
}
int sum(int l,int r){ //计算区间和
return sum(r)-sum(l-1);
}
void one_change(int i, int k) {
int diff = k - a[i]; // 计算变化的差值
a[i] = k; //更新第 i 个数的值
// 更新后续元素的前缀和
for (int j = i; j <= n; j += lowbit(j)) {
c[j] += diff;
}
}
int f(int x){
return 2*(abs(x*x*x-3*x)/(3*x*x+1));
}
int main()
{
//初始化树状数组
memset(c,0,sizeof(c));
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
add(i,a[i]);
}
//功能自行调用
while(q--){
scanf("%d%d%d",&op,&l,&r);
if(op==1){
for(int i=l;i<=r;i++){
one_change(i,f(a[i]));
}
}else{
cout<<sum(l,r)<<endl;
}
}
return 0;
}
求大佬帮忙看看,哪里有问题


查看30道真题和解析