10 Challenge 3(樹狀陣列直接修改)

2022-05-09 19:20:43 字數 1301 閱讀 5320

總時間限制: 

10000ms

單個測試點時間限制: 

1000ms

記憶體限制: 

262144kb

描述給乙個長為n的數列,有m次操作,每次操作是以下兩種之一:

(1)修改數列中的乙個數

(2)求數列中某連續一段的和

輸入第一行兩個正整數n和m。

第二行n個整數表示這個數列。

接下來m行,每行開頭是乙個字元,若該字元為'm',則表示乙個修改操作,接下來兩個整數x和y,表示把x位置的值修改為y;若該字元為'q',則表示乙個詢問操作,接下來兩個整數x和y,表示求[x,y]這段區間的和。

輸出對每乙個詢問操作單獨輸出一行,表示答案。

樣例輸入

5 3

1 2 3 4 5

q 1 5

m 2 7

q 1 5

樣例輸出

15

20

提示

1<=n<=10^5,1<=m<=10^5,輸入保證合法,且所有整數及答案可用帶符號32位整型儲存。

考慮樹狀陣列肯定是沒有什麼疑問的,

但是這裡不是加減,而是直接修改,

然而直接修改會爆零,原因自己yy一下就知道。

所以說,我們每次改的時候,去加上要加的數和當前的數的差,然後再把當前的數改成將要改的數

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn=100001;6

inta[maxn];

7int

tree[maxn];

8int

n,m;

9void read(int &n)

1013

while(c>='

0'&&c<='9'

)14 x=(x<<1)+(x<<3)+c-48,c=getchar();

15 flag==1?n=-x:n=x;16}

17int lb(int

p)18

21void add(int pos,int

v)2229}

30int sum(int

pos)

3139

return

ans;40}

41int

main()

4251

for(int i=1;i<=m;i++)

526263}

64return0;

65 }

樹狀陣列(3)

樹狀陣列的一些基本題型吧 之前說過,樹狀陣列能做的東西線段樹都能做 這麼簡單的樹狀陣列能不能做線段樹經常要做的改點 段 求段 點 呢?廢話,這麼簡單的東西答案當然是能啦 1 codevs 1080 include include using namespace std int c 100010 l ...

3種樹狀陣列

1 單調更新,區間查詢。sum i 的意思是從1 i的和。int n int c1 500 int lowbits int x int sum int x return sum1 int add int x,int y int main 2 區間更新,點查詢。把上面 的add x,k add y a...

樹狀陣列 模板3 求逆序對(非離散化)

離散化的樹狀陣列 這裡就提一下和普通樹狀陣列的區別,這裡是用要查詢的數當作下標,而普通樹狀陣列是直接順序下標放值,也就是說區別在於 updata函式,普通的是updata i,k 這裡的i就單純是區間下標 而求逆序對的時候是updata a i 1 我們每次都是在這個數字大小的位置上新增1,然後去更...