BZOJ1012 [JSOI2008]最大数maxnumber

单调栈存储最大值位置。

由于单调下降所以查找第一个大于当前查询位置的数即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int cnt,a[200005],h[200005],top,ans;
 4 int main()
 5 {
 6     int m,d;char s[3];
 7     scanf("%d%d",&m,&d);
 8     for(int i=1;i<=m;++i)
 9     {
10         scanf("%s",s);
11         if(s[0]=='Q')
12         {
13             int l;scanf("%d",&l);
14             printf("%d\n",ans=a[h[lower_bound(h+1,h+1+top,cnt-l+1)-h]]);
15         }
16         else
17         {
18             cnt++;
19             scanf("%d",&a[cnt]);
20             a[cnt]+=ans;a[cnt]%=d;
21             while(top&&a[cnt]>a[h[top]])top--;
22             h[++top]=cnt;
23         }
24     }
25     return 0;
26 }

 

posted @ 2018-01-10 17:19  大奕哥&VANE  阅读(120)  评论(0编辑  收藏  举报