フェンウィックツリー(ゾーンの変更、レンジクエリ)

1の#include <iostreamの>
 2の#include <cstdioを> 
 3  使用して 名前空間STDを、
4  
5  長い N、M。
6  長い 長い [ 500009 ]。 
7  長い 長い C [ 500009 ]、D [ 500009 ]。
8  長い 長い lowbit(長い 長いX)
 9  {
 10      リターン(X&( - X));
11  }
 12  の空隙の変化(長い 長い * E、長い 長い X、長い K)
 13  {
 14      のためにint型 I = xを、iが<= N; iは+ = lowbit(I))
 15      {
 16          E [I] + = K。
17      }
 18  }
 19  長い 長いクエリ(長い 長い * E、長い 長いX)
 20  {
 21      長い 長い和= 0 22      のためには、int型 I = xを、I> = 1 ; I- = lowbit(I))
 23     {
 24          和+ = E [I];
25      }
 26      リターン和。
27  }
 28  のint main()の
 29  {
 30      CIN >> N >> M。
31      のためには、int型 i = 1 ; iがn = <; iは++ 32      {
 33          CIN >> [I]。
34          変化(C、I、[I] -a [I- 1 ])。
35          変化(D、I、(長い 長い)(I- 1)*([I] -a [I- 1 ]))。
36      }
37      のためにint型 i = 1 ; iが<= N; iが++ 38      {
 39          COUT << C [I] << "  " 40      }
 41      COUT << ENDL。
42      のためにint型 i = 1 ; iが<= N; iが++ 43      {
 44          COUT << D [i]は<< "  " 45      }
 46      のためのint型 iは= 1 ; I <= M iは++ 47      {
 48          長い ロングP;
49          cinを>> のp;
50          もし(Pの== 1// 修改
51          {
 52              長い 長いR、L、V。
53              CIN >> R >> L >> V。
54              変化(C、R、V)。
55              変化(C、L + 1、 - V)。
56              変化(D、R、(長い 長い)(R- 1)* V)。
57              変化(D、L + 1、(長い 長い)-1 * V)。
58          }
59          もし(Pの== 2// 统计
60          {
 61              長い 長いR、L。
62              CIN >> R >> L。
63              長い 長い T1 =クエリ(C、R- 1)*(R- 1)-query(D、R- 1 )。
64              長い 長い T2 =クエリ(C、L)* 1- クエリ(D、L)。
65              のprintf(" %LLDする\ n "、T2- T1)。
66          }
 67      }
 68      リターン 0 69  }
70  / * 
71れる 。5 2
 72  。1 5 6 7 8
 73れている 。1 2 3 1 //変更[2-3] + 1 
 74  2 2 2〜4 //クエリ 
 75  * /

 

おすすめ

転載: www.cnblogs.com/1129-tangqiyuan/p/11221329.html
おすすめ