每日一题 day17 打卡
Analysis
二维树状数组的单点修改和区间查询,和一维的差不多
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define int long long 7 #define maxn 4096+10 8 #define INF 2147483647/2-1 9 using namespace std; 10 inline int read() 11 { 12 int x=0; 13 bool f=1; 14 char c=getchar(); 15 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 16 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 17 if(f) return x; 18 return 0-x; 19 } 20 inline void write(int x) 21 { 22 if(x<0){putchar('-');x=-x;} 23 if(x>9)write(x/10); 24 putchar(x%10+'0'); 25 } 26 int n,m; 27 int tree[maxn][maxn]; 28 inline int lowbit(int num) 29 { 30 return num&-num; 31 } 32 inline void build(int sx,int sy,int num) 33 { 34 for(int i=sx;i<=n;i+=lowbit(i)) 35 for(int j=sy;j<=m;j+=lowbit(j)) 36 tree[i][j]+=num; 37 } 38 inline int ask(int sx,int sy) 39 { 40 int ans=0; 41 for(int i=sx;i>=1;i-=lowbit(i)) 42 for(int j=sy;j>=1;j-=lowbit(j)) 43 ans+=tree[i][j]; 44 return ans; 45 } 46 signed main() 47 { 48 n=read();m=read(); 49 int in=0; 50 while(scanf("%d",&in)!=EOF) 51 { 52 if(in==1) 53 { 54 int x=read(),y=read(),k=read(); 55 build(x,y,k); 56 } 57 if(in==2) 58 { 59 int a=read(),b=read(),c=read(),d=read(); 60 write(ask(c,d)-ask(a-1,b-1)); 61 printf(" "); 62 } 63 } 64 return 0; 65 }
请各位大佬斧正(反正我不认识斧正是什么意思)