初学线段树求助,悬赏关注

P1198 [JSOI2008] 最大数

帮您改了两个地方,在注释里。 ``` #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


|