#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; }
求大佬帮忙看看,哪里有问题
全部评论
(0) 回帖