[JSOI2008]最大数
线段树。。。板子。。。不能再板子了。。。
一开始用了cin读字符。。。结果bzoj上T了。。。
然后修改了一下。。。过了。。。
呆码:
#include<iostream> #include<cstdio> #define INF -99999999 #define N 200020 using 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); } } }