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 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。