线段树。。。板子。。。不能再板子了。。。
一开始用了cin读字符。。。结果bzoj上T了。。。
然后修改了一下。。。过了。。。
呆码:
#include#include #define INF -99999999#define N 200020using namespace std;int len,n,t,m,mo,sum[N<<2];char ch;inline void build(int rt,int l,int r){ if(l==r) { sum[rt]=INF; return; } int mid=l+r>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);}inline void update(int rt,int l,int r,int L,int k){ if(l==r) { sum[rt]=k; return; } int mid=l+r>>1; if(L<=mid) update(rt<<1,l,mid,L,k); else update(rt<<1|1,mid+1,r,L,k); sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);}inline int query(int rt,int l,int r,int L,int R){ if(L<=l && r<=R) { return sum[rt]; } int mid=l+r>>1; int ans=INF; if(L<=mid) ans=max(ans,query(rt<<1,l,mid,L,R)); if(R>mid) ans=max(ans,query(rt<<1|1,mid+1,r,L,R)); return ans;}int main(){ scanf("%d%d",&m,&mo); build(1,1,200000); for(int i=1;i<=m;i++) { ch='F'; while(ch!='A' && ch!='Q') ch=getchar(); scanf("%d",&n); if(ch=='A') { update(1,1,N-20,len+1,(n+t)%mo); len+=1; } if(ch=='Q') { t=query(1,1,N-20,len-n+1,len); printf("%d\n",t); } }}