現在請求你維護乙個數列,要求提供以下兩種操作:
1、 查詢操作。
語法:q l
功能:查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。
限制:l不超過當前數列的長度。(l > 0)
2、 插入操作。
語法:a n
功能:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。
限制:n是整數(可能為負數)並且在長整範圍內。
注意:初始時數列是空的,沒有乙個數。
輸入第一行兩個整數,m和d,其中m表示操作的個數(m≤200,000),d如上文中所述,滿足(0接下來的m行,每行乙個字串,描述乙個具體的操作。語法如上文所述。
輸出對於每乙個查詢操作,你應該按照順序依次輸出結果,每個結果佔一行
樣例輸入
5 100
a 96
q 1a 97
q 1q 2
樣例輸出
9693
96提示
最後序列為:96 93
詢問動態區間max,顯然使用線段樹(雖然效率不高)。
有m次詢問,陣列最長為m,則開4*m的線段樹,並且不用建樹。
注意d的值!(long long)
#include
using
namespace std;
#define inf 0x3f3f3f3f
#define full(a,b,c) fill(b,b+sizeof a/4,c)
#define m 2000005
int nown,m;
long
long t,d;
long
long s[
4*m]
;void
update
(int k,
int l,
int r,
int x,
int v)
int mid=
(l+r)
>>1;
if(x<=mid)
update
(k*2
,l,mid,x,v)
;else
update
(k*2+1
,mid+
1,r,x,v)
; s[k]
=max
(s[k*2]
,s[k*2+
1]);
}long
long
ask(
int k,
int l,
int r,
int x,
int y)
intmain()
}
JSOI2008 最大數(線段樹基礎)
現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。l 0 2 插入操作。語法 a n 功能 將 n加上 t 其中 t是最近一次查詢操作的答案 如果還未執行過查詢操作,則 t 0 並將所...
JSOI2008最大數 資料結構
這道題有三個做法呢 第乙個就是普通的線段樹 太懶了不打了 第二個可以單調棧 二分 維護乙個單調遞減的單調棧 每次加入數的時候 把這個數前面小於它的都刪掉 然後查詢的時候二分找到最前面的在所求範圍內的 但是話說這種方法好像被加強的資料卡了?我也不帶了優化了 泥萌自己優化一下看能不能過 不過這種比較新穎...
線段樹 最大數
給定乙個正整數數列 a1,a2,an,每乙個數都在 0 p 1 之間。可以對這列數進行兩種操作 新增操作 向序列後新增乙個數,序列長度變成 n 1 詢問操作 詢問這個序列中最後 l 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案。輸入格式 第一...