1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #define M 200008
 5 using namespace std;
 6 int a[M],n,b[M],d,t,h,len;
 7 char ch[10];
 8 int main()
 9 {
10     scanf("%d%d",&n,&d);
11     for(int i=1;i<=n;i++)
12       {
13         int a1;
14         scanf("%s%d",ch,&a1);
15         if(ch[0]=='A')
16           {
17             len++;
18             a1+=t;
19             a1%=d;
20             for(;h&&a[h]<=a1;h--);
21             a[++h]=a1;
22             b[h]=len;
23           }
24         else
25           {
26             int a2=lower_bound(b+1,b+h+1,len-a1+1)-b;
27             t=a[a2];
28             printf("%d\n",t);
29           }
30       }
31     return 0;
32 }

用单调队列,如果加入一个数,它前面比他小的就没有价值了,然后开一个数组存位置,找时找最早出现在范围内的队内的数。

posted on 2016-02-28 06:37  xiyuedong  阅读(149)  评论(0编辑  收藏  举报