結果
問題 | No.1030 だんしんぐぱーりない |
ユーザー |
|
提出日時 | 2020-04-17 22:39:13 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 184 ms / 2,000 ms |
コード長 | 7,550 bytes |
コンパイル時間 | 2,561 ms |
コンパイル使用メモリ | 193,640 KB |
実行使用メモリ | 16,128 KB |
最終ジャッジ日時 | 2024-10-03 14:19:49 |
合計ジャッジ時間 | 7,886 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 40 |
コンパイルメッセージ
main.cpp:20: warning: "vec2ll" redefined 20 | #define vec2ll(a,b,c) vector<vecll>(a,vecll(b,c)) | main.cpp:19: note: this is the location of the previous definition 19 | #define vec2ll(a,b) vector<vecll>(a,vecll(b)) |
ソースコード
#pragma region Macros#pragma GCC optimize("O3")#include <bits/stdc++.h>#define ll long long#define ld long double#define rep2(i,a,b) for(ll i=a;i<=b;++i)#define rep(i,n) for(ll i=0;i<n;i++)#define rep3(i,a,b) for(ll i=a;i>=b;i--)#define pii pair<int,int>#define pll pair<ll,ll>#define pq priority_queue#define pb push_back#define eb emplace_back#define vec vector<int>#define vecll vector<ll>#define vecpii vector<pii>#define vecpll vector<pll>#define vec2(a,b) vector<vec>(a,vec(b))#define vec2ll(a,b) vector<vecll>(a,vecll(b))#define vec2ll(a,b,c) vector<vecll>(a,vecll(b,c))#define vec3(a,b,c) vector<vector<vec>>(a,vec2(b,c))#define vec3ll(a,b,c) vector<vector<vecll>>(a,vec2ll(b,c))#define fi first#define se second#define all(c) begin(c),end(c)#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);#define lb(c,x) distance(c.begin(),lower_bound(all(c),(x)))#define ub(c,x) distance(c.begin(),upper_bound(all(c),(x)))using namespace std;int in() {int x;cin>>x;return x;}ll lin() {ll x;cin>>x;return x;}string stin() {string s;cin>>s;return s;}template<class T> inline bool chmax(T& a,T b){if(a<b){a=b;return 1;}return 0;}template<class T> inline bool chmin(T& a,T b){if(a>b){a=b;return 1;}return 0;}vec iota(int n){vec a(n);iota(all(a),0);return a;}void print(){putchar(' ');}void print(bool a){cout<<a;}void print(int a){cout<<a;}void print(long long a){cout<<a;}void print(char a){cout<<a;}void print(string &a){cout<<a;}void print(double a){cout<<a;}template<class T> void print(const vector<T>&);template<class T, size_t size> void print(const array<T, size>&);template<class T, class L> void print(const pair<T, L>& p);template<class T, size_t size> void print(const T (&)[size]);template<class T> void print(const vector<T>& a){ if(a.empty()) return; print(a[0]); for(auto i = a.begin(); ++i != a.end(); ){ cout<<" "; print(*i);} cout<<endl;}template<class T> void print(const deque<T>& a){ if(a.empty()) return; print(a[0]); for(auto i = a.begin(); ++i != a.end(); ){ cout<<" "; print(*i);} }template<class T, size_t size> void print(const array<T, size>& a){ print(a[0]); for(auto i = a.begin(); ++i != a.end(); ){ cout<<" "; print(*i); } }template<class T, class L> void print(const pair<T, L>& p){ cout<<'(';print(p.first); cout<<","; print(p.second);cout<<')'; }template<class T, size_t size> void print(const T (&a)[size]){ print(a[0]); for(auto i = a; ++i != end(a); ){ cout<<" "; print(*i); } }template<class T> void print(const T& a){ cout << a; }int out(){ putchar('\n'); return 0; }template<class T> int out(const T& t){ print(t); putchar('\n'); return 0; }template<class Head, class... Tail> int out(const Head& head, const Tail&... tail){ print(head); putchar(' '); out(tail...); return 0; }ll gcd(ll a, ll b){ while(b){ ll c = b; b = a % b; a = c; } return a; }ll lcm(ll a, ll b){ if(!a || !b) return 0; return a * b / gcd(a, b); }#define _GLIBCXX_DEBU#define endl '\n'#ifdef _MY_DEBUG#undef endl#define debug(x) cout<<#x<<": "<<x<<endlvoid err(){}template<class T> void err(const T& t){ print(t); cout<<" ";}template<class Head, class... Tail> void err(const Head& head, const Tail&... tail){ print(head); putchar(' '); out(tail...); }#else#define debug(x)template<class... T> void err(const T&...){}#endif#pragma endregiontemplate< typename G >struct DoublingLowestCommonAncestor {const int LOG;vector< int > dep;const G &g;vector< vector< int > > table;DoublingLowestCommonAncestor(const G &_g) : g(_g), dep(_g.size()), LOG(32 - __builtin_clz(_g.size())) {table.assign(LOG, vector< int >(_g.size(), -1));}void dfs(int idx, int par, int d) {table[0][idx] = par;dep[idx] = d;for(auto &to : g[idx]) {if(to != par) dfs(to, idx, d + 1);}}void build() {dfs(0, -1, 0);for(int k = 0; k + 1 < LOG; k++) {for(int i = 0; i < table[k].size(); i++) {if(table[k][i] == -1) table[k + 1][i] = -1;else table[k + 1][i] = table[k][table[k][i]];}}}int query(int u, int v) {if(dep[u] > dep[v]) swap(u, v);for(int i = LOG - 1; i >= 0; i--) {if(((dep[v] - dep[u]) >> i) & 1) v = table[i][v];}if(u == v) return u;for(int i = LOG - 1; i >= 0; i--) {if(table[i][u] != table[i][v]) {u = table[i][u];v = table[i][v];}}return table[0][u];}};template< typename Monoid >struct SegmentTree {using F = function< Monoid(Monoid, Monoid) >;int sz;vector< Monoid > seg;const F f;const Monoid M1;SegmentTree(int n, const F _f, const Monoid &_M1) : f(_f), M1(_M1) {sz = 1;while(sz < n) sz <<= 1;seg.assign(2 * sz, M1);}void set(int k, const Monoid &x) {seg[k + sz] = x;}void build() {for(int k = sz - 1; k > 0; k--) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}void update(int k, const Monoid &x) {k += sz;seg[k] = x;while(k >>= 1) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}Monoid query(int a, int b) {Monoid L = M1, R = M1;for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if(a & 1) L = f(L, seg[a++]);if(b & 1) R = f(seg[--b], R);}return f(L, R);}Monoid operator[](const int &k) const {return seg[k + sz];}template< typename C >int find_subtree(int a, const C &check, Monoid &M, bool type) {while(a < sz) {Monoid nxt = type ? f(seg[2 * a + type], M) : f(M, seg[2 * a + type]);if(check(nxt)) a = 2 * a + type;else M = nxt, a = 2 * a + 1 - type;}return a - sz;}template< typename C >int find_first(int a, const C &check) {Monoid L = M1;if(a <= 0) {if(check(f(L, seg[1]))) return find_subtree(1, check, L, false);return -1;}int b = sz;for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if(a & 1) {Monoid nxt = f(L, seg[a]);if(check(nxt)) return find_subtree(a, check, L, false);L = nxt;++a;}}return -1;}template< typename C >int find_last(int b, const C &check) {Monoid R = M1;if(b >= sz) {if(check(f(seg[1], R))) return find_subtree(1, check, R, true);return -1;}int a = sz;for(b += sz; a < b; a >>= 1, b >>= 1) {if(b & 1) {Monoid nxt = f(seg[--b], R);if(check(nxt)) return find_subtree(b, check, R, true);R = nxt;}}return -1;}};constexpr int N = 300010;//それ、オーバーフローしない?!?!constexpr ll INF = 1e16;signed main(){ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);cout<<fixed<<setprecision(15);int n=in(),k=in(),q=in();vec c;rep(i,n)c.pb(in());vec a;rep(i,k)a.pb(in()-1);vector<vec> g(n);rep(i,n-1){int x=in()-1,y=in()-1;g[y].pb(x);}DoublingLowestCommonAncestor<vector<vec>> lca(g);lca.build();SegmentTree<int> seg(k,[&](int x,int y){if(x==-1)return y;if(y==-1)return x;return lca.query(x,y);},-1);rep(i,k)seg.set(i,a[i]);seg.build();auto dfs=[&](auto &f,int x,int t)->void{chmax(c[x],t);for(auto e:g[x]) f(f,e,c[x]);};dfs(dfs,0,0);while(q--){int id=in();if(id==1){int x=in()-1,y=in()-1;seg.update(x,y);}else{int l=in()-1,r=in();cout << c[seg.query(l,r)] << endl;}}}