1080 線段樹練習

2021-09-07 11:02:53 字數 1726 閱讀 3308

時間限制: 1 s

空間限制: 128000 kb

題目等級 : 鑽石 diamond

description

一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改:提問的形式是求某乙個特定的子區間[a,b]中所有元素的和;修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1≤n<100000,,提問和修改的總數m<10000條。

輸入描述

input description

輸入檔案第一行為乙個整數n,接下來是n行n個整數,表示格仔中原來的整數。接下乙個正整數m,再接下來有m行,表示m個詢問,第乙個整數表示詢問代號,詢問代號1表示增加,後面的兩個數x和a表示給位置x上的數值增加a,詢問代號2表示區間求和,後面兩個整數表示a和b,表示要求[a,b]之間的區間和。

輸出描述

output description

共m行,每個整數

樣例輸入

sample input

4 5 6 

2 1 

1 3 5

2 1 4

1 1 9

2 2 6

樣例輸出

sample output

資料範圍及提示

data size & hint

1≤n≤100000, m≤10000 。

分類標籤 tags 點此展開

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int maxn=1000001;7

intn,m;

8int

a[maxn];

9int sum[maxn*4

];10

void updata(int

rt)11

14void build(int l,int r,int

rt)15

21int m=(l+r)/2

;22 build(l,m,rt*2

);23 build(m+1,r,rt*2+1

);24

updata(rt);25}

26int query(int l,int r,int rt,int nowl,int

nowr)

2736

37if(m3841

42return

ans;43}

44void modify(int l,int r,int rt,int p,int

v)45

51int m=(l+r)/2;52

if(p<=m) modify(l,m,rt*2

,p,v);

53else modify(m+1,r,rt*2+1

,p,v);

54updata(rt);55}

56void print(int l,int r,int

rt)57

63int m=(l+r)/2

;64 print(l,m,rt*2

);65 print(m+1,r,rt*2+1

);66}67

intmain()

6884

else

858990}

91return0;

92 }

1080 線段樹練習

一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數m 10000條。輸入描述 inpu...

codevs1080線段樹練習(線段樹)

題目描述 description 一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數m...

Codevs 1080 線段樹練習

portal 這道題倒是點醒了我 樹狀陣列和線段樹不一樣 半小時前才學的概念傻傻分不清 主要思路是利用樹狀陣列儲存字首和,然後字首和相減得到區間和。線段樹的知識在藍書裡出現了,莫名其妙就從紫書公升級了?mark下我看的那篇部落格 這位也是厲害,用三種方法 include includeusing n...