poj 1195 Mobile phones (二维 树状数组)

 1 /*

 2 题意 :

 3   改变矩阵中元素值 ,求子矩阵的和

 4   二维树状数组,

 5 */

 6 

 7 #include<stdio.h>

 8 #define N 1050

 9 int s;

10 int map[N][N];

11 int lowbit(int x)

12 {

13     return x&(-x);

14 }

15 void add(int x,int y,int d)

16 {

17     int i=x;

18     int j=y;

19     while(i<=s)

20     {

21         j=y;

22         while(j<=s)

23         {

24             map[i][j]+=d;

25             j=j+lowbit(j);

26         }

27         i=i+lowbit(i);

28     }

29 }

30 int sum(int l,int b)

31 {

32     int i=l;

33     int j=b;

34     int ans=0;

35     while(i>0)

36     {

37         j=b;

38         while(j>0)

39         {

40             ans+=map[i][j];

41             j-=lowbit(j);

42         }

43         i-=lowbit(i);

44     }

45     return ans;

46 }

47 int main()

48 {

49     int l,i,j,x,y,d,L,b,r,t;

50     while(scanf("%d",&l)!=EOF)

51     {

52         if(l==3)break;

53         if(l==0)

54         {

55             scanf("%d",&s);

56             for(i=0;i<=s;i++)

57               for(j=0;j<=s;j++)

58                 map[i][j]=0;

59 

60         }

61         if(l==1)

62         {

63             scanf("%d%d%d",&x,&y,&d);

64             if(map[x+1][y+1]+d<0)continue;

65             add(x+1,y+1,d);

66         }

67         if(l==2)

68         {

69             scanf("%d%d%d%d",&L,&b,&r,&t);

70            int ans;

71              

72 

73            ans=sum(r+1,t+1)-sum(L,t+1)-sum(r+1,b)+sum(L,b);

74 

75             printf("%d\n",ans);

76         }

77     }

78 }

你可能感兴趣的:(mobile)