| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38742 | wl2025 | 【BJ】T1 | C++ | 通过 | 100 | 361 MS | 99676 KB | 4142 | 2025-10-23 15:28:21 |
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> #define fi first #define se second const int N = 2e5 + 5; int n, m, op, q; vector<pii> v[N]; int tot, rt[N]; struct sgt { int ls, rs, sum; } tr[20 * N]; #define ls(x) tr[x].ls #define rs(x) tr[x].rs void pushup(int x) { tr[x].sum = tr[ls(x)].sum + tr[rs(x)].sum; } void update(int &x, int pre, int l, int r, int p, int v) { x = ++tot; tr[x] = tr[pre]; if (l == r) { tr[x].sum += v; return; } int mid = (l + r) >> 1; if (p <= mid) update(ls(x), ls(pre), l, mid, p, v); else update(rs(x), rs(pre), mid + 1, r, p, v); pushup(x); } int query(int x, int l, int r, int L, int R) { if (L <= l && R >= r) return tr[x].sum; int mid = (l + r) >> 1, ans = 0; if (L <= mid) ans += query(ls(x), l, mid, L, R); if (R > mid) ans += query(rs(x), mid + 1, r, L, R); return ans; } set<pii> s; signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n >> m >> op; int all = 0; for (int i = 1, l, r, s; i <= m; i++) { cin >> l >> r >> s; all += s; if (l > r) swap(l, r); v[r].push_back({l, s}); } for (int i = 1; i <= n; i++) { rt[i] = rt[i - 1]; for (auto it : v[i]) update(rt[i], rt[i], 1, n, it.fi, it.se); } // cout<<tr[rt[4]].sum<<endl; //return 0; cin >> q; int lst = 0, sum = all; s.insert({1, n}); while (q--) { int tp, l, r; cin >> tp >> l >> r; l = l ^ (lst * op); r = r ^ (lst * op); if (l > r) swap(l, r); //if(!tp&&l==1&&r==1){ // cout<<l<<" "<<r<<" "<<s.size()<<endl; // return 0; //} if (!tp) { if (s.empty()) { sum += query(rt[r], 1, n, l, r); s.insert({l, r}); cout << (lst = all - sum) << '\n'; continue; } auto itl = s.lower_bound({l, 0}); if (itl != s.begin()) { itl--; if (itl->se < l - 1) itl++; } auto itr = s.lower_bound({r + 2, 0}); for (auto it = itl; it != itr; it++) { l = min(l, it->fi); r = max(r, it->se); sum -= query(rt[it->se], 1, n, it->fi, it->se); } s.erase(itl, itr); sum += query(rt[r], 1, n, l, r); s.insert({l, r}); } else { if (s.empty()) { cout << (lst = all - sum) << '\n'; continue; } auto itr = s.lower_bound({r + 1, 0}); if (itr != s.begin()) { itr--; if (itr->se > r) { int tl = itr->fi, tr = itr->se; sum -= query(rt[tr], 1, n, tl, tr); s.erase(itr); sum += query(rt[r], 1, n, tl, r); s.insert({tl, r}); sum += query(rt[tr], 1, n, r + 1, tr); itr = s.insert({r + 1, tr}).fi; } else itr++; } auto itl = s.lower_bound({l, 0}); if (itl != s.begin()) { itl--; if (itl->se >= l) { int tl = itl->fi, tr = itl->se; sum -= query(rt[tr], 1, n, tl, tr); s.erase(itl); sum += query(rt[l - 1], 1, n, tl, l - 1); s.insert({tl, l - 1}); sum += query(rt[tr], 1, n, l, tr); itl = s.insert({l, tr}).fi; } else itl++; } for (auto it = itl; it != itr; it++) sum -= query(rt[it->se], 1, n, it->fi, it->se); s.erase(itl, itr); } cout << (lst = all - sum) << '\n'; //return 0; } return 0; }