結果
問題 | No.1030 だんしんぐぱーりない |
ユーザー | ysystem7 |
提出日時 | 2020-04-17 22:16:44 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 326 ms / 2,000 ms |
コード長 | 3,911 bytes |
コンパイル時間 | 2,932 ms |
コンパイル使用メモリ | 222,796 KB |
実行使用メモリ | 28,864 KB |
最終ジャッジ日時 | 2024-10-03 13:40:09 |
合計ジャッジ時間 | 11,762 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
5,888 KB |
testcase_01 | AC | 4 ms
6,016 KB |
testcase_02 | AC | 4 ms
5,888 KB |
testcase_03 | AC | 4 ms
5,888 KB |
testcase_04 | AC | 4 ms
5,888 KB |
testcase_05 | AC | 208 ms
22,528 KB |
testcase_06 | AC | 214 ms
18,560 KB |
testcase_07 | AC | 154 ms
11,520 KB |
testcase_08 | AC | 155 ms
13,440 KB |
testcase_09 | AC | 181 ms
22,784 KB |
testcase_10 | AC | 97 ms
8,704 KB |
testcase_11 | AC | 231 ms
15,104 KB |
testcase_12 | AC | 151 ms
20,096 KB |
testcase_13 | AC | 150 ms
19,072 KB |
testcase_14 | AC | 239 ms
19,072 KB |
testcase_15 | AC | 153 ms
8,320 KB |
testcase_16 | AC | 181 ms
16,512 KB |
testcase_17 | AC | 163 ms
23,040 KB |
testcase_18 | AC | 264 ms
19,456 KB |
testcase_19 | AC | 140 ms
10,240 KB |
testcase_20 | AC | 143 ms
14,592 KB |
testcase_21 | AC | 163 ms
28,864 KB |
testcase_22 | AC | 138 ms
26,224 KB |
testcase_23 | AC | 202 ms
22,364 KB |
testcase_24 | AC | 187 ms
24,108 KB |
testcase_25 | AC | 195 ms
25,960 KB |
testcase_26 | AC | 123 ms
20,916 KB |
testcase_27 | AC | 154 ms
21,284 KB |
testcase_28 | AC | 207 ms
26,408 KB |
testcase_29 | AC | 120 ms
24,524 KB |
testcase_30 | AC | 112 ms
22,828 KB |
testcase_31 | AC | 135 ms
22,552 KB |
testcase_32 | AC | 221 ms
26,904 KB |
testcase_33 | AC | 187 ms
25,012 KB |
testcase_34 | AC | 96 ms
24,296 KB |
testcase_35 | AC | 326 ms
28,136 KB |
testcase_36 | AC | 302 ms
25,980 KB |
testcase_37 | AC | 302 ms
28,332 KB |
testcase_38 | AC | 320 ms
26,048 KB |
testcase_39 | AC | 321 ms
25,764 KB |
testcase_40 | AC | 5 ms
20,332 KB |
testcase_41 | AC | 6 ms
20,276 KB |
ソースコード
#pragma GCC optimize("Ofast") #include <bits/stdc++.h> #define rep(i,n) for(int i=0;i<n;i++) #define cinf(n,x) for(int i=0;i<(n);i++)cin>>x[i]; #define ft first #define sc second #define pb push_back #define lb lower_bound #define ub upper_bound #define all(v) (v).begin(),(v).end() #define mod 1000000007 #define FS fixed<<setprecision(15) using namespace std; typedef long long ll; template<class T> using V=vector<T>; using Graph = vector<vector<int>>; using P=pair<ll,ll>; typedef unsigned long long ull; typedef long double ldouble; template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } const ll INF=1e18; const int max_E=100005,max_log_v=30;//調整 //入力 vector<int> G[max_E]; int root; int N;//頂点数 int par[max_log_v][max_E];//親を2^k回辿って到達する頂点(根を通り過ぎる場合は-1) int depth[max_E];//根からの深さ void dfs(int v,int p,int d){ par[0][v]=p; depth[v]=d; for(int i=0;i<G[v].size();i++){ if(G[v][i]!=p) dfs(G[v][i],v,d+1); } } //初期化 絶対に忘れるな!!! void init_(int v_){ //par[0]とdepthを初期化する dfs(root,-1,0); //parを初期化 for(int k=0;k+1<max_log_v;k++){ for(int v=0;v<v_;v++){ if(par[k][v]<0) par[k+1][v]=-1; else par[k+1][v]=par[k][par[k][v]]; } } } //uとvのLCAを求める int lca(int u,int v){ //uとvの深さが同じになるまで親をたどる if(depth[u]>depth[v]) swap(u,v); for(int k=0;k<max_log_v;k++){ if((depth[v]-depth[u])>>k&1){ v=par[k][v]; } } if(u==v) return u; //二分探索でLCAを求める for(int k=max_log_v-1;k>=0;k--){ if(par[k][u]!=par[k][v]){ u=par[k][u]; v=par[k][v]; } } return par[0][u]; } const ll MAX_N=(1<<19); ll n,K,dat[2*MAX_N-1];//n...segmenttreeの葉の大きさ,N...与えられた数列等の大きさ ll a[1000000]; ll unit(){ return -1;//単位元 } ll calc(ll a,ll b){ if(a==-1||b==-1) return max(a,b); return lca(a,b);//演算 } //初期化 void init(){ n=1; while(n<K) n*=2;//座標とかであれば n<N ではなく n<(座標の最大値) 下も同様 for(int i=0;i<K;i++) dat[i+n-1]=a[i]; for(int i=K;i<n;i++) dat[i]=unit();//単位元で埋める } void update(ll k,ll s){ k+=n-1; dat[k]=s;//変更する式 while(k>0){ k=(k-1)/2; dat[k]=calc(dat[2*k+1],dat[2*k+2]);//条件 } } ll query(ll a,ll b,ll k,ll l,ll r){ if(r<=a||b<=l) return unit();//単位元 if(a<=l&&r<=b) return dat[k]; ll m=(l+r)/2; ll u=query(a,b,2*k+1,l,m); ll v=query(a,b,2*k+2,m,r); return calc(u,v);//条件 } int main(){ cin.tie(0);ios::sync_with_stdio(false); int Q; cin>>N>>K>>Q; V<ll> C(N); cinf(N,C); //V<int> a(K); rep(i,K){ cin>>a[i]; a[i]--; } rep(i,N-1){ int u,v; cin>>u>>v; u--;v--; G[u].push_back(v); G[v].push_back(u); } V<ll> ma(N); ma[0]=C[0]; V<int> dist(N,-1); queue<int> que; que.push(0); dist[0]=0; while(!que.empty()){ int v=que.front(); que.pop(); for(int nv:G[v]){ if(dist[nv]!=-1) continue; dist[nv]=dist[v]+1; que.push(nv); ma[nv]=max(C[nv],ma[v]); } } init_(N); init(); rep(i,K) update(i,a[i]); while(Q--){ int t; cin>>t; if(t==1){ int x,y; cin>>x>>y; x--;y--; update(x,y); }else{ ll l,r; cin>>l>>r; l--;r--; ll x=query(l,r+1,0,0,n); cout<<ma[x]<<'\n'; } } }