挺简单的 不过弄了好久。。。
/************************************************************** Problem: 1012 User: lxy8584099 Language: C++ Result: Accepted Time:612 ms Memory:3948 kb ****************************************************************/ /* 线段树挂了 可能是我写的丑 改用单调队列。 成心卡我的单调队列 入列可能是从大到小 这样我挨着挨着找就被卡死了 于是加了个二分 跑的还挺快? */ #include<cstdio> #define ll long long #define max(a,b) ((a>b)?(a):(b)) using namespace std; const int N=2e5+50; ll q[N],last,MOD,a[N]; int m,top,cnt; char s[10]; int main() { scanf("%d%lld",&m,&MOD); for(int i=1;i<=m;i++) { scanf("%s",s); if(s[0]=='A') { ll x; scanf("%lld",&x); a[++cnt]=(last+x)%MOD; while(top&&a[q[top]]<=a[cnt]) top--; q[++top]=cnt; } else { int k,now=top,ans=top; scanf("%d",&k); k=cnt-k+1; int l=1,r=top; while(l<=r) { int mid=(l+r)>>1; if(q[mid]>=k) { ans=mid;r=mid-1; } else l=mid+1; } printf("%lld\n",last=a[q[ans]]); } } return 0; }