思路:
线段树 (分类讨论)
此题数据很水 数据很水 数据很水
但是卡个暴力还是没问题的……
//By SiriusRen
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 1500000
#define inf 1061109567
int n,tot,jy,xx,yy,tree[maxn*6],vis[maxn],cases,q[maxn];
inline int min(int x,int y){return x<y?x:y;}
void insert(int l,int r,int pos){
if(l==r){tree[pos]=l;return;}
int mid=(l+r)>>1;
if(mid>=jy)insert(l,mid,pos<<1);
else insert(mid+1,r,pos<<1|1);
tree[pos]=min(tree[pos<<1],tree[pos<<1|1]);
}
int query(int l,int r,int pos){
if(l>=xx&&r<=yy)return tree[pos];
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<xx)return query(mid+1,r,rson);
else if(mid>=yy)return query(l,mid,lson);
else return min(query(l,mid,lson),query(mid+1,r,rson));
}
int main(){
while(scanf("%d",&n)&&n){
memset(tree,0x3f,sizeof(tree));
memset(vis,0,sizeof(vis)),tot=0;
printf("Case %d:
",++cases);
for(int ii=1;ii<=n;ii++){
register char p=getchar(),ch;
while(p!='A'&&p!='B')p=getchar();
scanf("%d",&jy);
if(p=='B'){
insert(0,maxn,1);
vis[jy]=++tot;
q[tot]=jy;
}
else if(p=='A'){
int ans=inf,rec=-1;
if(jy<=5000){
for(int i=tot;i;i--){
if(q[i]%jy<ans)
ans=q[i]%jy,rec=i;
if(!ans)goto end;
}goto end;
}
for(int i=0;i<=1000000;i+=jy){
xx=i,yy=i+jy-1;
int temp=query(0,maxn,1);
if(temp<inf){
if(ans>temp-i)
ans=temp-i,rec=vis[temp];
else if(ans==temp-i&&rec<vis[temp])rec=vis[temp];
}
}
end:printf("%d
",rec);
}
}
puts("");
}
}