給定乙個長度為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...