帮您改了两个地方,在注释里。
```
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n ,m ,q ,last;
struct Tree {int l ,r ,val;}t[N * 4];
void pushup(int u) {t[u].val = max(t[u << 1].val ,t[u << 1 | 1].val);}
void build(int u ,int l ,int r)
{
t[u] = {l ,r}; // t[u].l = {l ,r};
if(l == r) return;
int mid = (l + r) >> 1;
build(u << 1 ,l ,mid) ,build(u << 1 | 1 ,mid + 1 ,r);
}
int query(int u ,int l ,int r)
{
if(t[u].l >= l && t[u].r <= r)
return t[u].val;
int mid = (t[u].l + t[u].r) >> 1 ,cnt = 0; // int mid = (l + r) >> 1 ,cnt = 0;
if(l <= mid) cnt = query(u << 1 ,l ,r);
if(r > mid) cnt = max(cnt ,query(u << 1 | 1 ,l ,r));
return cnt;
}
void add(int u ,int x ,int v)
{
if(t[u].l == t[u].r) t[u].val = v;
else
{
int mid = (t[u].l + t[u].r) >> 1;
if(x <= mid) add(u << 1 ,x ,v);
else add(u << 1 | 1 ,x ,v);
t[u].val = max(t[u << 1].val ,t[u << 1 | 1].val);
}
}
int main()
{
scanf("%d%d" ,&m ,&q);
build(1 ,1 ,m);
while(m--)
{
char op[2];
int x;
scanf("%s%d" ,op ,&x);
if(*op == 'Q')
{
last = query(1 ,n - x + 1 ,n);
printf("%d\n" ,last);
}
if(*op == 'A')
{
++n;
add(1 ,n,(last + x) % q);
}
}
return 0;
} // test
```
可以自行理解最好自行理解,不行的话私信我,有空回答一下。
by cqazy811 @ 2022-10-25 13:37:15
@[abablx](/user/711584)
by cqazy811 @ 2022-10-25 13:37:29
@[bxnya_miana](/user/297675) 谢谢,已关
by abablx @ 2022-10-25 17:40:57