Codevs 1082 線段樹練習 3

2022-02-13 09:44:27 字數 1595 閱讀 5470

1082 線段樹練習 3

時間限制: 3 s

空間限制: 128000 kb

題目等級 : 大師 maste

傳送門題目描述 description

給你n個數,有兩種操作:

1:給區間[a,b]的所有數增加x

2:詢問區間[a,b]的數的和。

輸入描述 input description

第一行乙個正整數n,接下來n行n個整數,

再接下來乙個正整數q,每行表示操作的個數,

如果第乙個數是1,後接3個正整數,

表示在區間[a,b]內每個數增加x,如果是2,

表示操作2詢問區間[a,b]的和是多少。

輸出描述 output description

對於每個詢問輸出一行乙個答案

樣例輸入 sample input

3 1

2 3

2 1 2 3 2

2 2 3

樣例輸出 sample output

9 資料範圍及提示 data size & hint

資料範圍

1<=n<=200000

1<=q<=200000

/*

裸線段樹.

區間修改+區間查詢.

*/#include

#include

#define maxn 200001

#define ll long long

using namespace std

;ll n,m,tot,cut,aa[maxn+10];

struct data

tree[maxn*4];

void build(int l,int r)

int mid=(l+r)>>1

; tree[k].lc=cut+1

; build(l,mid);

tree[k].rc=cut+1

; build(mid+1,r);

tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;}

void updata(int k)

void add(int k,int l,int r,int add1)

if(tree[k].bj) updata(k);

int mid=(tree[k].l+tree[k].r)>>1

; if(l<=mid) add(tree[k].lc,l,r,add1);

if(r>mid) add(tree[k].rc,l,r,add1);

tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;}

ll query(int k,int l,int r)

int main()

build(1,n);

cin>>m;

for(int i=1

;i<=m;i++)

else

}return 0

;

}

codevs 1082 線段樹練習 3

1082 線段樹練習 3 區間修改,區間查詢 時間限制 3 s 空間限制 128000 kb 題目等級 大師 master 給你n個數,有兩種操作 1 給區間 a,b 的所有數增加x 2 詢問區間 a,b 的數的和。輸入描述 input description 第一行乙個正整數n,接下來n行n個整數...

codevs 1082 線段樹練習 3

時間限制 3 s 空間限制 128000 kb 題目等級 大師 master 題解給你n個數,有兩種操作 1 給區間 a,b 的所有數增加x 2 詢問區間 a,b 的數的和。輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,每行表示操作的個數...

Codevs1082 線段樹練習 3

題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數增加x 2 詢問區間 a,b 的數的和。輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,每行表示操作的個數,如果第乙個數是1,後接3個正整數,表示在區間 ...