Poj 1195 Mobile phones(2 Dツリー配列)

7898 ワード

http://poj.org/problem?id=1195
模版問題iはkと書いて1時間以上探しても見つからなかった.

 1 #include <iostream>

 2 #include<cstring>

 3 #include<algorithm>

 4 #include<stdlib.h>

 5 #include<cstdio>

 6 using namespace std;

 7 #define N 1050

 8 #define lowbit(x) (x&(-x))

 9 int n,c[N][N];

10 void add(int i,int j,int da)

11 {

12     int k;

13     while(i<=n)

14     {

15         k = j;

16         while(k<=n)

17         {

18             c[i][k]+=da;

19             k+=lowbit(k);

20         }

21         i+=lowbit(i);

22     }

23 }

24 int getsum(int i,int j)

25 {

26     int sum=0,k;

27     while(i)

28     {

29         k = j;

30         while(k)

31         {

32             sum+=c[i][k];

33             k-=lowbit(k);

34         }

35         i-=lowbit(i);

36     }

37     return sum;

38 }

39 int main()

40 {

41     int k,a,b,cc,d,t;

42     cin>>t>>n;

43     memset(c,0,sizeof(c));

44     while(scanf("%d",&k),k!=3)

45     {

46         if(k==1)

47         {

48             scanf("%d%d%d",&a,&b,&cc);

49             add(a+1,b+1,cc);

50         }

51         else if(k==2)

52         {

53             scanf("%d%d%d%d",&a,&b,&cc,&d);

54             a++;b++;cc++;d++;

55             printf("%d
",getsum(cc,d)-getsum(a-1,d)-getsum(cc,b-1)+getsum(a-1,b-1)); 56 } 57 } 58 return 0; 59 }

View Code