题意
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ls (k << 1)
#define rs (k << 1 | 1)
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int n, m, p;
struct Tree
{
int l, r, mx;
} tr[N * 4];
void push_up(int k)
{
tr[k].mx = max(tr[ls].mx, tr[rs].mx);
}
void build(int k, int l, int r)
{
tr[k] = {
l, r };
if (l == r)
{
return;
}
int md = (l + r) >> 1;
build(ls, l, md);
build(rs, md + 1, r);
}
int query(int k, int l, int r)
{
if (tr[k].l > r || tr[k].r < l) return -inf;
if (tr[k].l >= l && tr[k].r <= r) return tr[k].mx;
return max(query(ls, l, r), query(rs, l, r));
}
void update(int k, int l, int r, int x)
{
if (tr[k].l > r || tr[k].r < l) return;
if (tr[k].l == tr[k].r)
{
tr[k].mx = x;
return;
}
update(ls, l, r, x);
update(rs, l, r, x);
push_up(k);
}
int main()
{
scanf("%d %d", &m, &p);
char op[2]; int x;
build(1, 1, m);
int last = 0;
for (int i = 1; i <= m; i ++) {
scanf("%s %d", op, &x);
if (op[0] == 'A')
{
++ n;
update(1, n, n, (1LL * x + last) % p);
}
else
{
printf("%d\n", last = query(1, n - x + 1, n));
}
}
return 0;
}