大意:
m次操作
1.查询后l个数当中的最大值
2.上一次查询的结果加上指定数并取模加到数组的后面
思路:
ST表 裸的。f[i][j]查询i后面2^j个数中的最大值
数组动态更新。
线段树:
改一下板子,把查询最后l个数的最大值改为查询【n-l+1,n】的区间最大值。
注意数组开够即可。
ST表code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e5+10;
ll lg[N];
ll f[N][20];
ll m,n=0;
ll mod;
void init()
{
lg[1]=0;
lg[2]=1;
for(int i=3;i<=N;++i) lg[i]=lg[i/2]+1;
}
void change(ll x){
f[++n][0]=x;
for(int i=1;i<=lg[n];++i) f[n][i]=max(f[n][i-1],f[n-(1<<(i-1))][i-1]);
}
char a;
ll b;
int main()
{
init();
cin>>m>>mod;
ll t=0;
for(int i=1;i<=m;++i){
cin>>a>>b;
if(a=='A'){
change((t+b)%mod);
// cout<<(t+b)%mod<<endl;
continue;
}
else{
ll k=lg[b];
t=max(f[n][k],f[n-b+(1<<k)][k]);
cout<<t<<endl;
}
}
return 0;
}