士兵殺敵(二)(線段樹)

2021-08-06 03:03:36 字數 1964 閱讀 3571

士兵殺敵(二)

時間限制:1000 ms | 記憶體限制:65535 kb

難度:5

描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。

小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。

南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。

輸入 只有一組測試資料

第一行是兩個整數n,m,其中n表示士兵的個數(1< n<1000000),m表示指令的條數。(1< m<100000)

隨後的一行是n個整數,ai表示第i號士兵殺敵數目。(0<=ai<=100)

隨後的m行每行是一條指令,這條指令包含了乙個字串和兩個整數,首先是乙個字串,如果是字串query則表示南將軍進行了查詢操作,後面的兩個整數m,n,表示查詢的起始與終止士兵編號;如果是字串add則後面跟的兩個整數i,a(1<=i<=n,1<=a<=100),表示第i個士兵新增殺敵數為a.

輸出 對於每次查詢,輸出乙個整數r表示第m號士兵到第n號士兵的總殺敵數,每組輸出佔一行

樣例輸入

5 6

1 2 3 4 5

query 1 3

add 1 2

query 1 3

add 2 3

query 1 2

query 1 5

樣例輸出

6 8

8 20

線段樹,套模板。

#include

#include

using

namespace

std;

#define l o<<1

#define r (o<<1)|1

const

int max = 1000000+10;

struct node

tree[max*3];

void pushup(int o)

void build(int o,int l,int r)

int mid = (l+r) >> 1; //找到中間節點

build(o*2 , l , mid); //遞迴建左子樹

build(o*2+1 , mid+1 , r); //遞迴建右子樹

pushup(o); //更新當前節點的值

}void update(int o,int l,int r,int x,int y) //把x節點更新為y

int mid = (l+r) / 2; //找到中間位置

if (x <= mid)

update(o*2,l,mid,x,y); //找左子樹

else

update(o*2+1,mid+1,r,x,y); //找右子樹

pushup(o); //更新當前節點

}int querysum(int o,int l,int r,int x,int y) //查詢x到y的和

int mid = (l + r) / 2;

if (mid >= y) //全在左邊

return querysum(o*2,l,mid,x,y);

else

if (x > mid) //全在右邊

return querysum(o*2+1,mid+1,r,x,y);

else

//一半在左一半在右

return querysum(o*2,l,mid,x,mid) + querysum(o*2+1,mid+1,r,mid+1,y);

}int main()

else

} // printf ("%d\n",querymax(1,1,n,2,4));

return

0;}

士兵殺敵(二) 線段樹

描述南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。輸入 只有一組測試資料 第一行是兩個整數n...

士兵殺敵(二) 線段樹

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,...

nyoj116 士兵殺敵(二) 線段樹)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候...