树状数组(区间修改,区间查询 )

匿名 (未验证) 提交于 2019-12-02 23:49:02
 1 #include<iostream>  2 #include<cstdio>   3 using namespace std;  4   5 long long n,m;  6 long long a[500009];   7 long long c[500009],d[500009];  8 long long lowbit(long long x)  9 { 10     return (x&(-x)); 11 } 12 void change(long long *e,long long x,long long k) 13 { 14     for(int i=x;i<=n;i+=lowbit(i)) 15     { 16         e[i]+=k; 17     } 18 } 19 long long query(long long *e,long long x) 20 { 21     long long sum=0; 22     for(int i=x;i>=1;i-=lowbit(i)) 23     { 24         sum+=e[i]; 25     } 26     return sum; 27 } 28 int main() 29 { 30     cin>>n>>m; 31     for(int i=1;i<=n;i++) 32     { 33         cin>>a[i]; 34         change(c,i,a[i]-a[i-1]); 35         change(d,i,(long long)(i-1)*(a[i]-a[i-1])); 36     } 37     for(int i=1;i<=n;i++) 38     { 39         cout<<c[i]<<" "; 40     } 41     cout<<endl; 42     for(int i=1;i<=n;i++) 43     { 44         cout<<d[i]<<" "; 45     } 46     for(int i=1;i<=m;i++) 47     { 48         long long p; 49         cin>>p; 50         if(p==1)//修改  51         { 52             long long r,l,v; 53             cin>>r>>l>>v; 54             change(c,r,v); 55             change(c,l+1,-v); 56             change(d,r,(long long)(r-1)*v); 57             change(d,l+1,(long long)-l*v); 58         } 59         if(p==2)//统计  60         { 61             long long r,l; 62             cin>>r>>l; 63             long long t1=query(c,r-1)*(r-1)-query(d,r-1); 64             long long t2=query(c,l)*l-query(d,l); 65             printf("%lld\n",t2-t1); 66         } 67     } 68     return 0; 69 } 70 /* 71 5 2 72 1 7 6 5 8 73 1 2 3 1//修改【2~3】+1  74 2 2 4//查询2~4  75 */

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!