結果
問題 | No.1641 Tree Xor Query |
ユーザー |
![]() |
提出日時 | 2021-08-08 00:40:23 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 88 ms / 5,000 ms |
コード長 | 5,139 bytes |
コンパイル時間 | 1,202 ms |
コンパイル使用メモリ | 113,140 KB |
実行使用メモリ | 24,284 KB |
最終ジャッジ日時 | 2024-09-18 20:30:52 |
合計ジャッジ時間 | 2,493 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 18 |
ソースコード
#include <cmath>#include <deque>#include <algorithm>#include <iterator>#include <list>#include <tuple>#include <map>#include <unordered_map>#include <queue>#include <set>#include <unordered_set>#include <stack>#include <string>#include <vector>#include <fstream>#include <iostream>#include <functional>#include <numeric>#include <iomanip>#include <stdio.h>#include <assert.h>#include <cstring>//eolibraries#ifdef _MSC_VER#include <intrin.h>#endifnamespace atcoder {namespace internal {int ceil_pow2(int n) {int x = 0;while ((1U << x) < (unsigned int)(n)) x++;return x;}int bsf(unsigned int n) {#ifdef _MSC_VERunsigned long index;_BitScanForward(&index, n);return index;#elsereturn __builtin_ctz(n);#endif}} // namespace internal} // namespace atcodernamespace atcoder {template <class S, S (*op)(S, S), S (*e)()> struct segtree {public:segtree() : segtree(0) {}segtree(int n) : segtree(std::vector<S>(n, e())) {}segtree(const std::vector<S>& v) : _n(int(v.size())) {log = internal::ceil_pow2(_n);size = 1 << log;d = std::vector<S>(2 * size, e());for (int i = 0; i < _n; i++) d[size + i] = v[i];for (int i = size - 1; i >= 1; i--) {update(i);}}void set(int p, S x) {assert(0 <= p && p < _n);p += size;d[p] = x;for (int i = 1; i <= log; i++) update(p >> i);}S get(int p) {assert(0 <= p && p < _n);return d[p + size];}S prod(int l, int r) {assert(0 <= l && l <= r && r <= _n);S sml = e(), smr = e();l += size;r += size;while (l < r) {if (l & 1) sml = op(sml, d[l++]);if (r & 1) smr = op(d[--r], smr);l >>= 1;r >>= 1;}return op(sml, smr);}S all_prod() { return d[1]; }template <bool (*f)(S)> int max_right(int l) {return max_right(l, [](S x) { return f(x); });}template <class F> int max_right(int l, F f) {assert(0 <= l && l <= _n);assert(f(e()));if (l == _n) return _n;l += size;S sm = e();do {while (l % 2 == 0) l >>= 1;if (!f(op(sm, d[l]))) {while (l < size) {l = (2 * l);if (f(op(sm, d[l]))) {sm = op(sm, d[l]);l++;}}return l - size;}sm = op(sm, d[l]);l++;} while ((l & -l) != l);return _n;}template <bool (*f)(S)> int min_left(int r) {return min_left(r, [](S x) { return f(x); });}template <class F> int min_left(int r, F f) {assert(0 <= r && r <= _n);assert(f(e()));if (r == 0) return 0;r += size;S sm = e();do {r--;while (r > 1 && (r % 2)) r >>= 1;if (!f(op(d[r], sm))) {while (r < size) {r = (2 * r + 1);if (f(op(d[r], sm))) {sm = op(d[r], sm);r--;}}return r + 1 - size;}sm = op(d[r], sm);} while ((r & -r) != r);return 0;}private:int _n, size, log;std::vector<S> d;void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }};} // namespace atcoder// cut here#define lnf 3999999999999999999#define inf 999999999#define fi first#define se second#define pb push_back#define ll long long#define ld long double#define all(c) (c).begin(),(c).end()#define sz(c) (int)(c).size()#define make_unique(a) sort(all(a)),a.erase(unique(all(a)),a.end())#define pii pair <int,int>#define rep(i,n) for(int i = 0 ; i < n ; i++)#define drep(i,n) for(int i = n-1 ; i >= 0 ; i--)#define crep(i,x,n) for(int i = x ; i < n ; i++)#define vi vector <int>#define vec(...) vector<__VA_ARGS__>#define _37ckhvj ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)//eodefineusing namespace std;const int mxn=12000;int op(int a,int b){return a^b;}int e(){return 0;}int main(){_37ckhvj;int n,q;cin>>n>>q;vi a(n);rep(i,n) cin>>a[i];vec(vi) adj(n,vi());rep(i,n-1){int u,v;cin>>u>>v;u--,v--;adj[v].pb(u);adj[u].pb(v);}vi tcnt(n,0),tour,tourid(n,0);atcoder::segtree<int,op,e> seg(n+1);rep(i,n) seg.set(i,0);auto dfs=[&](auto self,int v,int par)->int{tour.pb(v);tourid[v]=sz(tour)-1;seg.set(tourid[v],a[v]);int s=1;for(auto u : adj[v]){if(u==par) continue;s+=self(self,u,v);}return tcnt[v]=s;};dfs(dfs,0,-1);rep(i,q){int t,x,y;cin>>t>>x>>y;x--;if(t==2){int sum=seg.prod(tourid[x],tourid[x]+tcnt[x]);cout<<sum<<"\n";}else{seg.set(tourid[x],seg.get(tourid[x])^y);}// rep(j,n) cout<<seg.get(j)<<" ";// cout<<"\n";}// //return 0;}