QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#587297#7461. Fusion treeXiaohuba0 0ms0kbC++234.2kb2024-09-24 19:13:072024-09-24 19:13:07

Judging History

你现在查看的是最新测评结果

  • [2024-09-24 19:13:07]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2024-09-24 19:13:07]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

// #define LOCK_GETCHAR
// #define USE_INT_128

#if __cplusplus < 201400
#warning "Please use c++14 or higher."
#define CONSTEXPR_FUNC
#define ENABLE_IF_INT
#else
#define CONSTEXPR_FUNC constexpr
#define ENABLE_IF_INT , enable_if_t<_is_integer<T>, int> = 0
template <class T> constexpr bool _is_integer = numeric_limits<T>::is_integer;
template <> constexpr bool _is_integer<bool> = false;
template <> constexpr bool _is_integer<char> = false;
#ifdef USE_INT_128
template <> constexpr bool _is_integer<__int128> = true;
template <> constexpr bool _is_integer<__uint128_t> = true;
#endif
#endif

#if !defined(_WIN32) && !defined(LOCK_GETCHAR)
#define getchar getchar_unlocked
#endif

#define il inline
#define mkp make_pair
#define fi first
#define se second
#define _loop_i_t(j, k) make_signed_t<decltype((j) - (k))>
#define For(i, j, k) for (_loop_i_t(j, k) i = (j); i <= (k); ++i) // NOLINT
#define ForDown(i, j, k)                                                       \
  for (_loop_i_t(j, k) i = (j); i >= decltype(i)(k); --i) // NOLINT
#define eb emplace_back
#ifndef ONLINE_JUDGE
#define FileIO(filename)                                                       \
  freopen(filename ".in", "r", stdin);                                         \
  freopen(filename ".out", "w", stdout)
#else
#define FileIO(filename) void(0)
#endif

using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using db = double;
using ldb = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#ifdef USE_INT_128
using lll = __int128_t;
using ulll = __uint128_t;
#endif

// clang-format off
CONSTEXPR_FUNC il ll qpow(ll x, ull y, ll mod){ ll ans = 1; x %= mod; while (y) { if (y & 1) (ans *= x) %= mod; (x *= x) %= mod; y >>= 1; } return ans; }
template<typename T> CONSTEXPR_FUNC il void cmin(T & x, const T &y){ x = min(x, y); }
template<typename T> CONSTEXPR_FUNC il void cmax(T & x, const T &y){ x = max(x, y); }
template<typename T ENABLE_IF_INT> il void read(T &x){ x = 0; int f = 1; int c = getchar(); while (!isdigit(c)) { if (c == '-') f = -1; c = getchar(); } while (isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } x *= f; }
template<typename T, typename ... Args> il void read(T &x, Args &... y){ read(x), read(y...); }
// clang-format on

// File head end

namespace {
constexpr ll MAXN = 5e5 + 5;
int n, m, fa[MAXN], a[MAXN], tag[MAXN], rt[MAXN], ch[MAXN * 21][2],
    sz[MAXN * 21], val[MAXN * 21], cnt = 0;
vector<int> T[MAXN];
void dfs(int x, int pre) {
  fa[x] = pre;
  for (int v : T[x])
    if (v != pre)
      dfs(v, x);
}
void ins(int &p0, int x) {
  if (!p0)
    p0 = ++cnt;
  int p = p0;
  sz[p]++, val[p] ^= x;
  For(i, 0, 20) {
    int o = x >> i & 1;
    if (!ch[p][o])
      ch[p][o] = ++cnt;
    p = ch[p][o], sz[p]++, val[p] ^= x >> (i + 1) << (i + 1);
  }
}
void del(int p, int x) {
  assert(p);
  sz[p]--, val[p] ^= x;
  For(i, 0, 20) {
    int o = x >> i & 1;
    assert(ch[p][o]);
    p = ch[p][o], sz[p]--, val[p] ^= x >> (i + 1) << (i + 1);
  }
}
void addOne(int dep, int p) {
  if (dep == 21)
    return;
  swap(ch[p][0], ch[p][1]);
  addOne(dep + 1, ch[p][1]);
  val[p] =
      val[ch[p][0]] ^ val[ch[p][1]] ^ ((sz[ch[p][1]] & 1) ? (1 << dep) : 0);
}

il void Main() {
  read(n, m);
  For(i, 1, n - 1) {
    int u, v;
    read(u, v), T[u].eb(v), T[v].eb(u);
  }
  For(i, 1, n) read(a[i]);
  dfs(1, 0);
  For(i, 1, n) for (int j : T[i]) if (j != fa[i]) ins(rt[i], a[j]);
  // cerr << val[rt[2]] << ' ' << a[1] << '\n';
  while (m--) {
    int op, x, y;
    read(op, x);
    if (op == 1) {
      if (fa[fa[x]])
        del(rt[fa[fa[x]]], a[fa[x]] + tag[fa[fa[x]]]);
      a[fa[x]]++;
      if (fa[fa[x]])
        ins(rt[fa[fa[x]]], a[fa[x]] + tag[fa[fa[x]]]);
      tag[x]++;
      addOne(0, rt[x]);
    } else if (op == 2) {
      read(y);
      if (fa[x])
        del(rt[fa[x]], a[x] + tag[fa[x]]);
      a[x] -= y;
      if (fa[x])
        ins(rt[fa[x]], a[x] + tag[fa[x]]);
    } else {
      cout << (val[rt[x]] ^ (fa[x] ? (a[fa[x]] + tag[fa[fa[x]]]) : 0)) << '\n';
    }
  }
}
} // namespace

signed main() { return Main(), 0; }

详细


Pretests


Final Tests

Test #1:

score: 0
Runtime Error

input:

1000 998
1 2
2 3
2 4
3 5
5 6
2 7
5 8
1 9
8 10
7 11
3 12
9 13
8 14
12 15
9 16
6 17
8 18
2 19
19 20
7 21
21 22
14 23
15 24
1 25
13 26
16 27
3 28
17 29
15 30
11 31
1 32
25 33
4 34
32 35
12 36
11 37
24 38
16 39
14 40
17 41
17 42
39 43
35 44
40 45
18 46
10 47
19 48
23 49
21 50
3 51
27 52
46 53
19 54
5 55...

output:


result:


Test #2:

score: 0
Runtime Error

input:

732 927
1 2
1 3
2 4
2 5
3 6
6 7
6 8
8 9
5 10
7 11
9 12
2 13
3 14
14 15
5 16
2 17
16 18
12 19
2 20
4 21
1 22
4 23
13 24
2 25
25 26
5 27
7 28
3 29
7 30
28 31
26 32
29 33
3 34
22 35
15 36
9 37
36 38
22 39
26 40
10 41
39 42
1 43
33 44
11 45
18 46
9 47
32 48
38 49
38 50
17 51
15 52
23 53
22 54
1 55
41 56...

output:


result:


Test #3:

score: 0
Runtime Error

input:

888 957
1 2
1 3
1 4
4 5
2 6
3 7
4 8
6 9
8 10
10 11
9 12
9 13
4 14
12 15
1 16
5 17
15 18
14 19
12 20
17 21
7 22
10 23
18 24
7 25
14 26
17 27
17 28
5 29
9 30
10 31
1 32
9 33
15 34
5 35
29 36
5 37
31 38
8 39
15 40
16 41
38 42
36 43
39 44
42 45
24 46
10 47
17 48
38 49
27 50
49 51
50 52
13 53
28 54
14 55...

output:


result:


Test #4:

score: 0
Runtime Error

input:

98741 99956
74835 85030
85030 28368
74835 68215
68215 92388
74835 79089
28368 36904
79089 66465
74835 93241
28368 87962
28368 95370
74835 61859
28368 66251
66465 30174
68215 31110
74835 53487
79089 85715
85030 81833
28368 87215
66465 92843
92388 85032
68215 87899
93241 44543
93241 84738
28368 84503
...

output:


result:


Test #5:

score: 0
Runtime Error

input:

98749 99996
74835 85030
85030 28368
85030 68215
85030 92388
68215 79089
92388 36904
74835 66465
85030 93241
74835 87962
92388 95370
92388 61859
36904 66251
68215 30174
85030 31110
68215 53487
92388 85715
79089 81833
36904 87215
85030 92843
74835 85032
68215 87899
74835 44543
68215 84738
85030 84503
...

output:


result:


Test #6:

score: 0
Runtime Error

input:

98741 99956
74835 85030
85030 28368
28368 68215
28368 92388
28368 79089
28368 36904
92388 66465
68215 93241
28368 87962
28368 95370
92388 61859
68215 66251
66465 30174
93241 31110
68215 53487
95370 85715
74835 81833
74835 87215
87962 92843
66465 85032
93241 87899
95370 44543
92388 84738
28368 84503
...

output:


result:


Test #7:

score: 0
Runtime Error

input:

500000 499998
490227 471442
490227 499003
490227 369864
490227 494579
490227 479601
490227 486294
490227 476073
490227 471990
490227 486941
490227 482358
490227 482292
490227 497143
490227 488454
490227 495448
490227 494294
490227 404800
490227 493828
490227 482597
490227 481109
490227 447198
490227...

output:


result:


Test #8:

score: 0
Runtime Error

input:

500000 499998
490227 471442
490227 499003
471442 369864
369864 494579
499003 479601
479601 486294
479601 476073
490227 471990
476073 486941
479601 482358
476073 482292
369864 497143
471990 488454
486294 495448
482292 494294
490227 404800
499003 493828
471990 482597
494579 481109
476073 447198
404800...

output:


result:


Test #9:

score: 0
Runtime Error

input:

500000 499998
490227 471442
471442 499003
471442 369864
499003 494579
490227 479601
490227 486294
490227 476073
471442 471990
499003 486941
490227 482358
471990 482292
486294 497143
494579 488454
471990 495448
499003 494294
479601 404800
494579 493828
486941 482597
404800 481109
369864 447198
476073...

output:


result:


Test #10:

score: 0
Runtime Error

input:

500000 499998
490227 471442
490227 499003
490227 369864
499003 494579
494579 479601
471442 486294
490227 476073
369864 471990
471990 486941
486941 482358
494579 482292
486941 497143
490227 488454
471442 495448
479601 494294
490227 404800
494579 493828
499003 482597
499003 481109
486294 447198
471442...

output:


result: