現在請求你維護乙個數列,要求提供以下兩種操作:
1、 查詢操作。
語法:q l
功能:查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。
限制:l不超過當前數列的長度。
2、 插入操作。
語法:a n
功能:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。
限制:n是整數(可能為負數)並且在長整範圍內。
注意:初始時數列是空的,沒有乙個數。
輸入格式:
第一行兩個整數,m和d,其中m表示操作的個數(m <= 200,000),d如上文中所述,滿足(0接下來的m行,每行乙個字串,描述乙個具體的操作。語法如上文所述。
輸出格式:
對於每乙個查詢操作,你應該按照順序依次輸出結果,每個結果佔一行。
輸入樣例#1:
5 100a 96
q 1a 97
q 1q 2
輸出樣例#1:
969396
[jsoi2008]
題解:線段樹端點維護區間最大值(3個點re調不出來)
const
maxn=250000;
var tree:array[1..maxn*4,1..3]of int64;
m,x,last,sum:int64;
i,n:longint;
ch:char;
procedure build(x:longint);
var mid:longint;
begin
if tree[x,1]=tree[x,2] then exit;
mid:=(tree[x,1]+tree[x,2])shr 1;
tree[x,3]:=-maxlongint div 3;
tree[x+x,1]:=tree[x,1];tree[x+x,2]:=mid;
tree[x+x+1,1]:=mid+1;tree[x+x+1,2]:=tree[x,2];
build(x+x);
build(x+x+1);
end;
function max(a,b:int64):int64;
begin
if a>b then exit(a) else exit(b);
end;
procedure insert(p,x,y:int64);
var mid:longint;
begin
if (tree[p,1]=x)and(tree[p,2]=x) then
begin
tree[p,3]:=y;
exit;
end;
mid:=(tree[p,1]+tree[p,2])shr 1;
if x<=mid then insert(p+p,x,y) else
if x>mid then insert(p+p+1,x,y);
tree[p,3]:=max(tree[p+p,3],tree[p+p+1,3]);
end;
function get(p,x,y:int64):int64;
var mid:longint;
begin
if (tree[p,1]=x)and(tree[p,2]=y) then exit(tree[p,3]);
mid:=(tree[p,1]+tree[p,2])shr 1;
if y<=mid then get:=get(p+p,x,y) else
if x>mid then get:=get(p+p+1,x,y) else
get:=max(get(p+p,x,mid),get(p+p+1,mid+1,y));
end;
begin
readln(n,m);
tree[1,1]:=1;tree[1,2]:=n+100;
build(1);
for i:=1 to n do
begin
readln(ch,x);
if ch='a' then
begin
inc(sum);
insert(1,sum,(x+last)mod m);
end;
if ch='q' then
begin
last:=get(1,sum-x+1,sum);
writeln(last);
end;
end;
end.
洛谷 1198 線段樹
線段樹的單點更新 區間查詢,典型的求區間最大值。如下 1 include2 using namespace std 3 typedef unsigned int ui 4 typedef long long ll 5 typedef unsigned long long ull 6 define p...
洛谷1198最大數(線段樹)
現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得結果對乙個固定...
洛谷1198 最大數 線段樹
現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。l 0 2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得結果對...