1 /* 2 这一题有点坑,刚开始的时候就想着对于每一个y分成n/y段来统计, 3 但是发现y很小的时候效率很糟糕,然后就想不出了,以为会有什么超绝的想法 4 或者结合数论来搞,然后就是糟糕的百度题解!! 5 发现y很小的时候直接暴力,这效率能行么,对于算时间复杂度我是完全不会的, 6 暴力时间O(n),用线段树时间 O(N/Y*log(N));只能说y取10^3的时候两者时间差不多, 7 最后感觉是卡过的,但又因为有插入操作,如果都是询问的或者都是插入的话时间大概为10^8 8 然后如果有一半插入的话,时间就更短,所以应该可以吧; 9 10 */ 11 12 13 #include<cstdio> 14 #include<cstring> 15 #include<cstdlib> 16 #include<iostream> 17 #include<algorithm> 18 #include<cmath> 19 #define lson l,m,rt<<1 20 #define rson m+1,r,rt<<1|1 21 using namespace std; 22 const int N=500000+10; 23 //const int Maxn=40000+10; 24 const int limt=1000; 25 int minv[N<<2],n; 26 int ti[N],vi[N],sz; 27 void pushup(int rt){ 28 minv[rt]=min(minv[rt<<1],minv[rt<<1|1]); 29 } 30 void update(int L,int R,int v,int l,int r,int rt){ 31 if (L<=l && r<=R){ 32 minv[rt]=v; 33 return; 34 } 35 int m=(l+r)>>1; 36 if (L<=m) update(L,R,v,lson); 37 if (m< R) update(L,R,v,rson); 38 pushup(rt); 39 } 40 void query1(int y){ 41 int ret=-1,tmp=-1; 42 for (int i=sz-1;i>=0;i--){ 43 if (vi[i]%y==0) { 44 ret=i;break; 45 } 46 if (tmp==-1 || (vi[i]%y)<tmp) { 47 tmp=vi[i]%y;ret=i; 48 } 49 } 50 printf("%d\n",ret+(ret==-1?0:1)); 51 } 52 int query3(int L,int R,int l,int r,int rt){ 53 if(L<=l && r<=R){ 54 return minv[rt]; 55 } 56 int m=(l+r)>>1; 57 int t1,t2; 58 t1=t2=N; 59 if (L<=m) t1=query3(L,R,lson); 60 if (m< R) t2=query3(L,R,rson); 61 return min(t1,t2); 62 } 63 void query2(int y){ 64 int t,ret=-1; 65 for (int i=0;i<N;i+=y){ 66 // cout<<i<<" "<<i+y-1<<endl; 67 if (i+y-1>N) t=query3(i,N-1,0,N-1,1); 68 else t=query3(i,i+y-1,0,N-1,1); 69 if (t==N) continue; 70 // cout<<"** "<<t<<endl; 71 if (t%y<ret%y || ret==-1) ret=t; 72 else if (t%y==ret%y && ti[t]>ti[ret]) ret=t; 73 } 74 // cout<<ret<<endl; 75 if (ret==-1) printf("-1\n"); 76 else printf("%d\n",ti[ret]); 77 } 78 int main(){ 79 80 int T,cas=0; 81 while (~scanf("%d",&n),n){ 82 if (cas!=0 && n!=0) printf("\n"); 83 sz=0; 84 for (int i=0;i<(N<<2);i++) minv[i]=N; 85 printf("Case %d:\n",++cas); 86 for (int i=0;i<n;i++){ 87 char s[10];int x; 88 scanf("%s%d",s,&x); 89 if (s[0]=='A'){ 90 if (x<limt) query1(x); 91 else query2(x); 92 }else if (s[0]=='B'){ 93 vi[sz]=x; 94 ti[x]=sz+1; 95 update(x,x,x,0,N-1,1); 96 sz++; 97 } 98 } 99 } 100 return 0; 101 }