#include<cstdio>
#include<algorithm>
#include<iostream>
#include<typeinfo>
using namespace std;
#define ll long long
const int N=1e5+5;
const int logN=20;
ll cnt,t,st[N][logN],log[N];
ll q,mod;
int main(){
cin>>q>>mod;
for (int i=2;i<=1e5+5;i++) log[i]=log[i/2]+1;
for (int v=1;v<=q;v++){
cout<<v<<" "<<q<<endl;
char s;
ll x;
cin>>s>>x;
if (s=='A'){
st[++cnt][0]=(x+t)%mod;
if (cnt!=1){
for (int j=1;cnt-(1<<j)+1>=1;j++){
st[cnt][j]=max(st[cnt][j-1],st[cnt-(1<<(j-1))][j-1]);
}
}
}
else {
ll k=log[x];
t=max(st[cnt-x+1+(1<<k)-1][k],st[cnt][k]);
cout<<t<<'\n';
}
cout<<v<<" "<<q<<endl;
}
return 0;
}
如上代码在读入以下数据时,q读成了16,循环了16次
5 100
A 96
Q 1
A 97
Q 1
Q 2
当我把代码从这样
ll q,mod;
改成这样之后
ll mod;
ll q;
读入q时,又奇迹般的读成了5,死改1小时,才发现是这段代码的问题
for (int i=2;i<=1e5+5;i++) log[i]=log[i/2]+1;
这段代码会越界,越界的值会赋给q,当我把q放下面时,越界的值会赋给mod