本题中,如果初始化
void pre()
{
logn[1]=0,logn[2]=1;
for(int i=3;i<maxn;i++)
logn[i]=logn[i/2]+1;
}
之后再调用 s=logn[r−l+1]; 就会re,然而直接采用
double ss=log(r-l+1)/log(2.0);
int s=ss;
就能通过,这是为什么呢,我想了很久没有想到原因
完整代码(RE版本):
#include<bits/stdc++.h>
using namespace std;
const int maxn=200020,lgn=22;
long long m,d,t,f[maxn][lgn],logn[lgn],cnt;
void pre()
{
logn[1]=0,logn[2]=1;
for(int i=3;i<maxn;i++)
logn[i]=logn[i/2]+1;
}
void insert(int x)
{
f[++cnt][0]=x;
for(int i=1;cnt-(1<<i)>=0;i++)
f[cnt][i]=max(f[cnt][i-1],f[cnt-(1<<(i-1))][i-1]);
}
long long find(int num)
{
int l=cnt-num+1,r=cnt;
int s=logn[r-l+1];
long long ans=max(f[r][s],f[l+(1<<s)-1][s]);
return ans;
}
int main()
{
cin>>m>>d;
pre();
for(int i=1;i<=m;i++){
char a;
long long num;
cin>>a>>num;
if(a=='A')
{
long long op=(num+t)%d;
insert(op);
}
else{
long long ans=find(num);
cout<<ans<<endl;
t=ans;
}
}
return 0;
}