我想问问就是类似于 P6587 的这种 Trie+线段树 强制在线的题怎么对拍
如果哪位佬实力强劲,一眼看出我哪里错了那就更好了/kel
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 7;
const int Siz = 6.2e6 + 7;
int n, m;
struct Trie {
struct Node { int l, r, sum, lz, cnt; } t[Siz];
#define ls(i) (t[i].l)
#define rs(i) (t[i].r)
int siz = 1;
void push_up(int cur) { t[cur].sum = t[ls(cur)].sum + t[rs(cur)].sum; t[cur].cnt = t[ls(cur)].cnt + t[rs(cur)].cnt; }
void f(int cur, int k) { t[cur].sum += k * t[cur].cnt, t[cur].lz += k; }
void push_down(int cur) {
if (ls(cur)) f(ls(cur), t[cur].lz);
if (rs(cur)) f(rs(cur), t[cur].lz);
t[cur].lz = 0;
}
void insert(int &cur, int x, int v, int dep) {
if (dep > 31) return ;
if (! cur) { cur = ++ siz; }
t[cur].sum += v, t[cur].cnt ++;
if (x & (1 << dep - 1)) insert(rs(cur), x, v, dep + 1);
else insert(ls(cur), x, v, dep + 1);
}
void modify(int cur, int x, int y, int v, int dep) {
if (dep > x + 1) return ;
if (dep == x + 1) { f(cur, v); return ; }
if (! cur) return ;
push_down(cur);
if (y & (1 << dep - 1)) modify(rs(cur), x, y, v, dep + 1);
else modify(ls(cur), x, y, v, dep + 1);
push_up(cur);
}
int query(int cur, int x, int y, int dep) {
if (dep > x + 1) return 0;
if (dep == x + 1) return t[cur].sum;
if (! cur) return 0;
push_down(cur);
if (y & (1 << dep - 1)) return query(rs(cur), x, y, dep + 1);
else return query(ls(cur), x, y, dep + 1);
}
} Trie;
int root = 1;
signed main () {
ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for (int i = 1, x; i <= n; i ++) cin >> x, Trie.insert(root, i, x, 1);
int lastans = 0;
while (m --) {
int opt; cin >> opt;
opt = (opt + lastans) % 2 + 1;
if (opt == 1) {
int x, y, v; cin >> x >> y >> v;
Trie.modify(root, x, y, v, 1);
} else {
int x, y; cin >> x >> y;
cout << (lastans = Trie.query(root, x, y, 1)) << '\n';
}
}
return 0;
}