線段樹 簡單的整數問題2

2021-10-02 14:09:17 字數 2038 閱讀 4856

給定乙個長度為n的數列a,以及m條指令,每條指令可能是以下兩種之一:

1、「c l r d」,表示把 a[l],a[l+1],…,a[r] 都加上 d。

2、「q l r」,表示詢問 數列中第 l~r 個數的和。

對於每個詢問,輸出乙個整數表示答案。

輸入格式

第一行兩個整數n,m。

第二行n個整數a[i]。

接下來m行表示m條指令,每條指令的格式如題目描述所示。

輸出格式

對於每個詢問,輸出乙個整數表示答案。

每個答案佔一行。

資料範圍

1 ≤n

,m≤1

05

1≤n,m≤10^5

1≤n,m≤

105,

∣ d∣

≤10000

|d|≤10000

∣d∣≤10

000,

∣ a[

i]∣≤

1000000000

|a[i]|≤1000000000

∣a[i]∣

≤100

0000

000輸入樣例:

10 5

1 2 3 4 5 6 7 8 9 10

q 4 4

q 1 10

q 2 4

c 3 6 3

q 2 4

輸出樣例:455

915多寫寫,找手感,固定模板。

#include

//#define int long long

const

int n=

1e5+7;

#define lson u<<1

#define rson u<<1|1

using

namespace std;

struct nodetr[n<<2]

;int n,m,a[n]

;void

pushup

(node &u,node &l,node &r)

void

pushup

(int u)

void

build

(int u,

int l,

int r)

;return;}

int mid=l+r>>1;

tr[u]=;

build

(lson,l,mid)

;build

(rson,mid+

1,r)

;pushup

(u);

}void

pushdown

(int u)

}node query

(int u,

int l,

int r)

pushdown

(u);

int mid=tr[u]

.l+tr[u]

.r>>1;

if(r<=mid)

return

query

(lson,l,r)

;else

if(l>mid)

return

query

(rson,l,r)

;else

}void

modify

(int u,

int l,

int r,

int c)

int mid=tr[u]

.l+tr[u]

.r>>1;

pushdown

(u);

//造成乙個區間add資訊不同所以必須先**

if(l<=mid)

modify

(lson,l,r,c);if

(r>mid)

modify

(rson,l,r,c)

;pushup

(u);

}int

main()

else

}return0;

}

線段樹 乙個簡單的整數問題(未完)

你有n個整數,a1,a2,an。你需要處理兩種操作。一種操作是在給定間隔中為每個數字新增一些給定數字。另一種是要求給定間隔中的數字總和。第一行包含兩個數字n和q.1 n,q 100000。第二行包含n個數字,a1,a2,an的初始值。1000000000 ai 1000000000。接下來的q行中的...

線段樹 區間修改(加法) 乙個簡單的整數問題

你有n個整數,a1,a2,an。你需要處理兩種操作。一種操作是在給定間隔中為每個數字新增一些給定數字。另一種是要求給定間隔中的數字總和。第一行包含兩個數字n和q.1 n,q 100000。第二行包含n個數字,a1,a2,an的初始值。1000000000 ai 1000000000。接下來的q行中的...

線段樹問題

description 給出了乙個序列,你需要處理如下兩種詢問。c a b c 表示給 a,b 區間中的值全部增加c 10000 c 10000 q a b 詢問 a,b 區間中所有值的和。input 第一行包含兩個整數n,q。1 n,q 100000.第二行包含n個整數,表示初始的序列a 1000...