不是权值线段树上的动态开点!就是很正常的线段树用动态开点开出来点(为了尝试动态开点)但是RE + MLE了,求助(样例过了)
#include <bits/stdc++.h>
const int N = 5e5 + 10;
using namespace std;
inline int read()
{
int t;
cin >> t;
return t;
}
int Q, mod, ans, num;
struct node{
int ls, rs, mx;
#define ls(p) tr[p].ls
#define rs(p) tr[p].rs
#define mx(p) tr[p].mx // maxx
}tr[N+10];
int root, tot;
inline void update(int p) { mx(p) = max(mx(ls(p)), mx(rs(p))); return;}
void insert(int &p, int l, int r, int val, int pos)
{
if(!p) p = ++tot;
if(l == pos and r == pos)
{
mx(p) = val;
return ;
}
int mid = l + r >> 1;
if(pos <= mid) insert(ls(p), l, mid, val, pos);
else insert(rs(p), mid + 1, r, val, pos);
update(p);
return ;
}
int qry(int p, int l, int r, int L, int R)
{
if(!p) return 0;
if(L <= l and r <= R) return mx(p);
int mid = l + r >> 1;
int Val = 0;
if(L <= mid) Val = max(Val, qry(ls(p), l, mid, L, R));
if(R > mid) Val = max(Val, qry(rs(p), mid + 1, r, L, R));
return Val;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
Q = read(), mod = read();
root = ++tot;
while(Q --)
{
char op;
cin >> op;
if(op == 'Q')
{
int len = read();
ans = qry(root, 1, Q, num - len + 1, num);
cout << ans << endl;
}
else
{
int val = ((ans + read()) % mod + mod) % mod;
insert(root, 1, Q, val, ++ num); // num 记录当前插入了几个数
}
}
return 0;
}