1.​​题目链接​​。这个题目是很特殊的,因为插入点在数组的末尾,所以可以用树状数组维护区间最值。树状数组维护区间最值也只有在这种情况下成立。就是在数组的末尾插入的时候。对于每个点我们维护[x-lowbit(x)+1,x]这个区间的最值。然后对于区间[l,r]的查询,我们把它分割成几个小的区间.在每个区间求最值之后合并,即可得到答案。

#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int num[N], c[N], cnt;
int getNum(int l, int r)
{
int ret = num[r];
while (l <= r)
{
ret = max(ret, num[r]);
for (--r; r - l >= (r&(-r)); r -= (r&(-r)))
ret = max(ret, c[r]);
}
return ret;
}
#pragma warning(disable:4996)
int main()
{
int n, d;
char op[3];
scanf("%d%d", &n, &d);
int t = 0;
while (n--)
{
int a;
scanf("%s%d", op, &a);
if (op[0] == 'A')
{
num[++cnt] = (t + a) % d;
c[cnt] = max(getNum(cnt - (cnt&(-cnt)) + 1, cnt - 1), num[cnt]);
}
else
{
t = getNum(cnt - a + 1, cnt);
printf("%d\n", t);
}
}
return 0;
}