給定乙個長度為n數列,現對這個序列有兩種操作:u l r x:將區間 [l, r] 每個數加x;
q l r:查詢從第l個數到第r個數得最大值和最小值。 所有的數都 <=1000
輸入格式:
第一行給定乙個整數n, m,表示有n個數。m個操作 以下接著一行,n個數。
再接下來m行每行乙個操作。
輸出格式:
對於每個查詢輸出一行最大值和最小值。
in:5 3
1 2 3 4 5
u 1 2 3
u 5 5 -10
q 1 5
out:
5 -5
#include
#define ll long long
using
namespace std;
int a[
200010];
int mx[
2000
], mi[
2000
], add[
2000];
int len, n, m;
pair<
int,
int>
query
(int l,
int r)
}else
for(
int i=bl+
1;i)//中間塊
for(
int i=br*len; i<=r; i++
)//暴力右塊
}return
make_pair
(max, min);}
void
revise
(int l,
int r,
int x)
mi[bl]
=min
(mi[bl]
, a[i]
+add[bl]);
mx[bl]
=max
(mx[bl]
, a[i]
+add[bl]);
}}else
mi[bl]
=min
(mi[bl]
, a[i]
+add[bl]);
mx[bl]
=max
(mx[bl]
, a[i]
+add[bl]);
}for
(int i=bl+
1;i)//中間塊
mi[br]=(
1<<30)
, mx[br]=-
(1<<30)
;for
(int i=br*len; i<
(br+1)
*len; i++
)//暴力右塊
mi[br]
=min
(mi[br]
, a[i]
+add[br]);
mx[br]
=max
(mx[br]
, a[i]
+add[br]);
}}}int
build
(int n)
for(
int i=
0;iintmain()
build
(n);
while
(m--
)else}}
return0;
}
區間修改 區間查詢模板
如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下 操作1 ...
樹狀陣列 區間修改,區間查詢
也許更好的閱讀體驗 好東西,以後可以不打線段樹了 本篇假定讀者都會最基礎的兩種樹狀陣列,即區改單查和單改區查 思考如何維護乙個區間的值,想到了差分 對乙個差分陣列做一次字首和可以得到每個位置的值 再對每個位置累加一下就是乙個區間的值 公式化的講,就是 設差分陣列為 c 則每個位置的值 val i s...
樹狀陣列區間修改區間查詢
題面 首先,我們要推乙個柿子。displaystyle sum a i 把a i 用差分陣列表示出來,就可以寫成 displaystyle sum sum d i 我們考慮一下,每個d i 出現的次數是一定的。那我們可以換一下列舉順序,先列舉d i 在列舉他出現的次數,就可以變成 displayst...