洛谷1198 最大值 線段樹

2021-07-27 11:03:38 字數 2317 閱讀 2536

現在請求你維護乙個數列,要求提供以下兩種操作:

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 100

a 96

q 1a 97

q 1q 2

輸出樣例#1:

96

9396

[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 並將所得結果對...