标签:
(来自luogu)原题目
lowbit(x)=2^k次幂,k为x末尾0的数量。大家可以模拟试试lowbit
(-x)=(~x)+1,把x取反+1
void update(int x,int k)表示a[x]+=k(单点更新)
int sum(int x)表示求1-x区间和
求x-y区间和只需要sum(y)-sum(x-1)即可
#include <iostream> #include <string> #include <cstring> #define lowbit(x) ((x)&(-(x)))//这里也可以写函数233 using namespace std; int c[524288+1],n,m,x,y,z; void update(int x,int k)//a[x]+=k;
{ for(int i=x;i<=n;i+=lowbit(i)) c[i]+=k; } int sum(int x)//int ans=0;for(int i=1;i<=x;i++)ans+=a[i];return ans;
{ int ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=c[i]; return ans; } int main()
{ cin >> n >> m; for(int i=1;i<=n;i++) { cin >> x; update(i,x); } for(int i=1;i<=m;i++) { cin >> x >> y >> z; if(x==1)update(y,z); if(x==2)cout << sum(z)-sum(y-1) << endl; } return 0; }
233
标签:
原文地址:http://www.cnblogs.com/oier/p/5926044.html