線段樹操作格仔

2021-07-25 08:54:32 字數 1464 閱讀 8590

有n個格仔,從左到右放成一排,編號為1-n。

共有m次操作,有3種操作型別:

1.修改乙個格仔的權值,

2.求連續一段格仔權值和,

3.求連續一段格仔的最大值。

對於每個2、3操作輸出你所求出的結果。

輸入格式

第一行2個整數n,m。

接下來一行n個整數表示n個格仔的初始權值。

接下來m行,每行3個整數p,x,y,p表示操作型別,p=1時表示修改格仔x的權值為y,p=2時表示求區間[x,y]內格仔權值和,p=3時表示求區間[x,y]內格仔最大的權值。

輸出格式

有若干行,行數等於p=2或3的操作總數。

每行1個整數,對應了每個p=2或3操作的結果。

樣例輸入

4 3

1 2 3 4

2 1 3

1 4 3

3 1 4

樣例輸出6

3

#include #include #include#define max 100010

int data[max],datasum[max*4],datamax[max*4];

int index[max],max,sum;

int getmax(int a,int b)

void makesum(int root,int left,int right,int now,int add)

int mid=(left+right)/2;

if(now<=mid)

if(now>=mid+1)

return;

/*datasum[root] = add;

root/=2;

while(root>=1)*/}

void makemax(int root,int now)

}void init(int root,int start,int end)

int mid = (start+end)/2;

init(root*2,start,mid);

init(root*2+1,mid+1,end);

}void printsum(int root,int left,int right,int start,int end)

mid = (start+end)/2;

if(mid>=left)

if(mid+1<=right)

return;

}void printmax(int root,int left,int right,int start,int end)

mid = (start+end)/2;

if(mid>=left)

if(mid+1<=right)

return;

}int main()

for(i=0;iif(p == 2)

if(p == 3) }

return 0;

}

操作格仔 線段樹

問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p...

操作格仔 線段樹

問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p...

藍橋杯 操作格仔 線段樹

題目 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p,x...