線段樹 數列操作

2021-05-04 15:52:44 字數 1889 閱讀 8498

假設有一列數 (1 ≤ i ≤ n) ,支援如下兩種操作:

(1)將 ak 的值加 d 。( k, d 是輸入的數)

(2) 輸出 as +as+1 +…+at 。( s, t 都是輸入的數, s ≤ t )

根據操作要求進行正確操作並輸出結果。

【輸入格式】

輸入檔案第一行乙個整數n(0<=n<=100000), 第二行為 n 個整數,表示 的初始值。

第三行為乙個整數m(0<=m<=150000),表示運算元 v 下接 m 行,每行描述乙個操作,有如下兩種情況:

add k d ( 表示將 ak 加 d , 1<=k<=n , d 為整數 )

sum s t (表示輸出 as +…+at )

【輸出格式】

對於每乙個 sum 提問,輸出結果

【輸入輸出樣例】

輸入: 4

1 4 2 3

3sum 1 3

add 2 50

sum 2 3

輸出: 7

56#include

#include

using

namespace

std;

const

intmaxn

=100010;

struct

node

tree

[maxn*2

];inta[

maxn

];int

tail

,n,m

,sum;

void

modify(int

now,

intleft

,int

right

,int

st)int

lcl=

tree

[now

].lc

,rcl

=tree

[now

].rc;

intmid

=(a1

+b1)>>

1;if (right

<=

mid)

else

if (left

>=

mid)

else

}void

getsum(int

now,

intleft

,int

right)

intlcl

=tree

[now

].lc

,rcl

=tree

[now

].rc;

intmid

=(a1

+b1)>>

1;if (right

<=

mid) getsum(lcl

,left

,right);

else

if (left

>=

mid) getsum(rcl

,left

,right);

else

}void

make_tree(inta1,

intb1)

else

if (a1+1

==b1) tree

[now

].sum=a

[b1];}

intmain()

;int s,

t;for (inti=

1;i<=

m;i++)

else

modify(1

,s-1

,s,t);

}return

0;}

cogs240 數列操作 線段樹

問題描述 假設有一列數 1 i n 支援如下兩種操作 1 將 ak 的值加 d k,d 是輸入的數 2 輸出 as as 1 at s,t 都是輸入的數,s t 根據操作要求進行正確操作並輸出結果。輸入格式 輸入檔案第一行乙個整數n 0 n 100000 第二行為 n 個整數,表示 的初始值。第三行...

數列求和 線段樹基礎

線段樹基礎題 操作包括 1.點修改 2.區間修改 3.區間查詢 線段樹基礎 數列求和 include define maxn 10007 數列總個數 define ls l,m,rt 1 define rs m 1,r,rt 1 1 int sum maxn 2 add maxn 2 sum求和,a...

無聊的數列 線段樹

維護乙個數列,支援兩種操作 1 1 l r k d 給出乙個長度等於r l 1的等差數列,首項為k,公差為d,並將它對應加到a l a r 的每乙個數上。即 令a l a l k,a l 1 a l 1 k d,a l 2 a l 2 k 2d a r a r k r l d。2 2 p 詢問序列的...