題目傳送門:23333
聽說是線段樹標算,但我不知道爲毛寫了一個黑科技。
--------------------------
黑科技
維護一個遞減棧,每次增加元素時,如果棧頂元素小於新增則彈出來保持遞減性。
並且同時存下棧中元素的號碼。
查詢時從棧頂往下找,找到一個在L以內最大的輸出即可。
--------------------------
以下論線段樹標算
開始有n個元素,後來加入m個,於是以【1,n+m】爲總區間建樹。
加入元素變成了單點修改。
查詢結尾變成了區間查詢。
然後就會發現世界是那麼美好!!
附黑科技代碼:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <windows.h>
#define rep(j,k,l) for (int j=k;j<=l;j++)
using namespace std;
int a[200005],st[200005];
int main(){
int n,m,ans=0,l=0,ll=0;
scanf("%d%d",&n,&m);
while (n--){
char ch=getchar();
while (ch!='A'&&ch!='Q') ch=getchar();
int k;
scanf("%d",&k);
if (ch=='A'){
k=(k+ans)%m;
ll++;a[ll]=k;
while (l>0&&k>a[st[l]]) l--;
l++;st[l]=ll;
}
else{
int p=l;
while (p>0&&k>=ll-st[p]+1)p--;
ans=a[st[p+1]];
printf("%d\n",ans);
}
}
return 0;
}