單點更新 區間求最值與和 線段樹

2021-06-07 18:41:28 字數 1619 閱讀 7908

除了平時做練習賽外,現在主要學習數論與資料結構,資料結構丟了好久了,重新學習還是發現了很多問題!

題意:在每個測試的第一行,是兩個正整數 n 和 m ( 0< n <= 100000, 0 < m <= 100000 ),分別代表學生的數目和操作的數目。

學生id編號分別從 1 編到 n。

第二行包含 n 個整數(範圍在 0 到 100 ),代表這 n 個學生的初始成績,其中第 i 個數代表 id 為 i 的學生的成績。

接下來有 m 行,每行有三個數,意思如下:

先輸入乙個數x,然後分兩種情況:    

(1 <= x <= 2^31-1)

若x^x%999997是乙個素數,則再輸入兩個數a,b, 

意思是將id為 a 的學生的成績更新成b  (1 <= a <= n,  0 <= b <= 100)  

若x^x%999997不是乙個素數,則再輸入兩個數le,ri, 

意思是輸出區間【le,ri】中的學生的最低成績、最高成績、成績總和 (1 <= le <= ri <= n)

sample input

2 869 24 

131744484  1 1

598487296  2 2

542004961  2 2

241081  1 2

23299929  2 36

213276816  1 2

85264  1 2

350288656  1 2

sample output

69 69 69

24 24 24

24 24 24

24 69 93

36 69 105

36 69 105

36 69 105

hint

【特別說明】

在本題中,我們認為0和1也是素數!!!!

#include#includeusing namespace std;

#define maxn 100005

#define maxn1 1000005

#define mod 999997

#define ll __int64

struct data

tree[3*maxn];

int a[maxn];

bool prime[maxn1];

int min(int p,int q)

void init()

void change(int p,int i,int x)

if(i<=tree[p<<1].r)

change(p<<1,i,x);

else

change(p<<1|1,i,x);

tree[p].minp=min(tree[p<<1].minp,tree[p<<1|1].minp);

tree[p].maxp=max(tree[p<<1].maxp,tree[p<<1|1].maxp);

tree[p].sump=tree[p<<1].sump+tree[p<<1|1].sump;

}data query(int p,int l,int r)

int main()

} }return 0;

}

杭電1754 線段樹(單點更新 區間最值)

杭電1754原題傳送門 線段樹單點更新詳解傳送門 寫在最前面 用scanf printf 代替cin cout 時間少的不是一點點。同樣的 scanf能過,cin超時。嗯,玄學做題。已過 include include include include using namespace std cons...

HDU 4032 線段樹單點更新 區間最值

1.題目鏈結。題目大意 在一段長為n的線段上,有m個操作。某人起始點在0,現在他想吃餡餅,m個操作種,第一種為在某個點長出來乙個餡餅,第二個為這個人要開始吃餡餅。吃餡餅的時候,總是找距離的當前點最近的那個點去吃,如果發現有兩個最近點,那麼就按照上一次的方向去吃。問最後操作完,這個人走了多長的距離?2...

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...