做的我吐血的题啊,吃饭时突然想到有个小地方错了,改了以后就AC #include<iostream> using namespace std; #define MAXN 500005 int rank[MAXN]; int vec[40005]; struct SegmentTree{ int left[MAXN*4],right[MAXN*4]; char exist[MAXN*4]; char unexist[MAXN*4]; inline void init(){ unexist[1]=1; } inline void build(int k,int l,int r){ left[k]=l; right[k]=r; exist[k]=0; unexist[k]=0; if(l==r) return ; int m=(l+r)>>1; build(k*2,l,m); build(k*2+1,m+1,r); } inline void push_up(int k){} inline void push_down(int k){ if(unexist[k]){ unexist[k*2]=unexist[k*2+1]=1; exist[k*2]=exist[k*2+1]=0; unexist[k]=0; } return ; } inline void insert(int k,int n){ exist[k]=1; if(left[k]==right[k]) return ; push_down(k); int m=(left[k]+right[k])>>1; if(n<=m) insert(k*2,n); else insert(k*2+1,n); } inline int query(int k,int l,int r){ if(left[k]==right[k]){ return left[k]; } push_down(k); int ret=-1; int m=(left[k]+right[k])>>1; if(l<=m) if(exist[k*2]) ret=query(k*2,l,r); if(ret!=-1) return ret; if(r>m) if(exist[k*2+1]) ret=query(k*2+1,l,r); return ret; } inline void run(int t){ char op[2]; int x; int ind=0; int i,j; for(i=0;i<t;i++){ scanf("%s%d",op,&x); if(op[0]=='B'){ insert(1,x); vec[ind++]=x; rank[x]=ind; } else{ if(ind==0){puts("-1");continue;} int opt=x,res=-1; if(x<1000){ for(j=ind-1;j>=0;j--) if(vec[j]%x<opt){ opt=vec[j]%x; res=j+1; if(opt==0) break; } printf("%d/n",res); } else{ int l=0,r=x-1; while(l<=500000){ r=(r<500000?r:500000); int tmp=query(1,l,r); if(tmp!=-1){ if(tmp%x<opt){ opt=tmp%x; res=rank[tmp]; } else if(tmp%x==opt&&rank[tmp]>rank[vec[res-1]]){ res=rank[tmp]; } } l+=x; r+=x; } printf("%d/n",res); } } } } }sgt; int main() { int t; int cas=1; sgt.build(1,0,500000); while(scanf("%d",&t)&&t){ sgt.init(); if(cas!=1) puts(""); printf("Case %d:/n",cas++); sgt.run(t); } } 、