本地能过,但是交到上面去CE了
有哪位捞看看
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 7;
const int Siz = 6.2e6 + 7;
int n, m;
struct Trie {
struct Node { int l = 0, r = 0, sum = 0, lz = 0, cnt = 0; } 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) { f(ls(cur), t[cur].lz); f(rs(cur), t[cur].lz); t[cur].lz = 0; }
void insert(int &cur, int x, int v, int dep) {
if (dep > 4) 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);
push_up(cur);
}
} Trie;
int root = 1;
int 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;
}