1. 程式人生 > >1012. [JSOI2008]最大數maxnumber【線段樹】

1012. [JSOI2008]最大數maxnumber【線段樹】

set end else 固定 ring nbsp ont space als

Description

  現在請求你維護一個數列,要求提供以下兩種操作:1、 查詢操作。語法:Q L 功能:查詢當前數列中末尾L
個數中的最大的數,並輸出這個數的值。限制:L不超過當前數列的長度。2、 插入操作。語法:A n 功能:將n加
上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對一個固定的常數D取
模,將所得答案插入到數列的末尾。限制:n是非負整數並且在長整範圍內。註意:初始時數列是空的,沒有一個
數。

Input

  第一行兩個整數,M和D,其中M表示操作的個數(M <= 200,000),D如上文中所述,滿足D在longint內。接下來

M行,查詢操作或者插入操作。

Output

  對於每一個詢問操作,輸出一行。該行只有一個數,即序列中最後L個數的最大數。

Sample Input

5 100
A 96
Q 1
A 97
Q 1
Q 2

Sample Output

96
93
96
將數組開到最大,將初始值設為-INF,插入的時候將那個點修改一下就好了。
18.03.27update;若數列為空的時候查詢答案應該為0,一開始寫的時候沒有註意現在被新數據卡掉了
 1 #include<iostream>
 2 #include<cstdio>
 3
#include<cstring> 4 #define LL long long 5 using namespace std; 6 7 struct node 8 { 9 LL val; 10 } Segt[1600005]; 11 LL INF; 12 13 LL Query(LL node,LL l,LL r,LL l1,LL r1) 14 { 15 if (l1>r||r1<l) 16 return INF; 17 if (l1<=l&&r<=r1) 18 return
Segt[node].val; 19 LL mid=(l+r)/2; 20 return max(Query(node*2,l,mid,l1,r1), 21 Query(node*2+1,mid+1,r,l1,r1)); 22 } 23 24 void Update(LL node,LL l,LL r,LL x,LL k) 25 { 26 if (l==r) 27 { 28 Segt[node].val=k; 29 return; 30 } 31 LL mid=(l+r)/2; 32 if (x<=mid) 33 Update(node*2,l,mid,x,k); 34 else 35 Update(node*2+1,mid+1,r,x,k); 36 Segt[node].val=max(Segt[node*2].val,Segt[node*2+1].val); 37 } 38 39 int main() 40 { 41 ios::sync_with_stdio(false); 42 LL n,p,x,r=0,t=0; 43 char ch; 44 cin>>n>>p; 45 memset(&INF,-0x7f,sizeof(INF)); 46 memset(Segt,-0x7f,sizeof(Segt)); 47 for (register int i=1; i<=n; ++i) 48 { 49 cin>>ch>>x; 50 if (ch==A) 51 { 52 x=(x+t)%p; 53 ++r; 54 Update(1,1,200000,r,x); 55 } 56 else 57 { 58 t=Query(1,1,200000,r-x+1,r); 59 if (t==INF) t=0; 60 cout<<t<<endl; 61 } 62 } 63 }

1012. [JSOI2008]最大數maxnumber【線段樹】