#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q,x,y,md,top;
char c;
ll f[800010];
void add(ll x,ll y,ll l,ll r,ll rt){
if(l==r){
f[rt] = y;
return ;
}
ll mid = (l+r)>>1;
if(x<=mid)add(x,y,l,mid,rt<<1);
else add(x,y,mid+1,r,(rt<<1)+1);
f[rt] = max(f[rt<<1],f[(rt<<1)+1]);
}
ll get(ll x,ll y,ll l,ll r,ll rt){
if(x<=l and r<=y){
return f[rt];
}
ll mid = (l+r)>>1,ans=-1234567890;
if(x<=mid)ans=max(ans,get(x,y,l,mid,rt<<1));
if(y>mid)ans=max(ans,get(x,y,mid+1,r,(rt<<1)+1));
return ans;
}
signed main(){
cin >> q >> md;
for(int i=1;i<=q;i++){
cin >>c >>x;
if(c=='Q'){
if(x==0) y=0;
else y = get(top-x+1,top,1,q,1);
cout << y << endl;
}if(c=='A'){
add(++top,(x+y)%md,1,q,1);
}
}
return 0;
}
P1198 [JSOI2008] 最大数
题目简化
维护一个数列,两个操作:
-
查询:后$L$个数中的最大值
-
添加:在最后添加一个数$(n+t\mod D)$
题解
本题直接使用线段树求取最大值,支持单点修改区间查询。
注意
由于有负数,需要在查询程序中写一个负数inf。
由于数据可能会很大,需要使用long long,不然 subtask 1 过不了