# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
607720 | bgnbvnbv | Birthday gift (IZhO18_treearray) | C++14 | 859 ms | 77184 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define prec fixed<<setprecision
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define ll long long
#define ld long double
#define fs first
#define sc second
#define all(x) x.begin(),x.end()
#define endl '\n'
#define taskname "tree"
#define pll pair<long long,long long>
#define pld pair<long double,long double>
#define bpc __builtin_popcount
using namespace std;
const ll inf = 1e9;
const int maxN=2e5+9;
const ll mod=1e9+7;
int n,m,q,a[maxN],lc[maxN],pa,plca;
set<int> ap[maxN],lcp[maxN];//xp[i] = positions of i trong x
vector<int> adj[maxN];
//lca
int tg=0, tin[maxN], tout[maxN];
int up[maxN][19];
void dfs(int v, int p){
tin[v] = ++tg;
up[v][0] = p;
for (int i = 1; i <= 18; ++i)
up[v][i] = up[up[v][i-1]][i-1];
for (int u : adj[v])
if (u != p)
dfs(u, v);
tout[v] = ++tg;
}
bool act(int u, int v){
return tin[u] <= tin[v] && tout[u] >= tout[v];
}
int lca(int u, int v){
if (act(u, v))return u;
if (act(v, u))return v;
for (int i = 18; i >= 0; --i)
if (!act(up[u][i], v))
u = up[u][i];
return up[u][0];
}
//*/
void Init(){
dfs(1,1);
for(int i=1;i<=m;i++)cin>>a[i],ap[a[i]].insert(i);
for(int i=1;i<=m-1;i++)lc[i]=lca(a[i],a[i+1]),lcp[lc[i]].insert(i);
}
void Enter(){
cin>>n>>m>>q;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
adj[u].pb(v);
adj[v].pb(u);
}
}
void Solve(){
while(q--){
ll t,l,r,k;
cin>>t>>l>>r;
if(t==2){
//3 log n
cin>>k;
pa=*(ap[k].upper_bound(l-1));
if(l<=pa&&pa<=r){cout<<pa<<" "<<pa<<endl;continue;}
plca=*(lcp[k].upper_bound(l-1));
if(l<=plca&&plca+1<=r){cout<<plca<<" "<<plca+1<<endl;continue;}
cout<<"-1 -1\n";
} else {
//8 log n
ap[a[l]].erase(l);
if(l>1)lcp[lc[l-1]].erase(l-1);
if(l<m)lcp[lc[l]].erase(l);
a[l]=r;
if(l>1)lc[l-1]=lca(a[l-1],a[l]);
if(l<m)lc[l]=lca(a[l],a[l+1]);
ap[a[l]].insert(l);
if(l>1)lcp[lc[l-1]].insert(l-1);
if(l<m)lcp[lc[l]].insert(l);
}
}
}
///Read every task 3 times
///Connect with previous task
///Hint in subtasks?
///Re-initialize efficiently
///Array bounds
///Int overflow
///Modulo
///Output
///File?
///Multi-tests?
signed main() {
cin.tie(nullptr);ios_base::sync_with_stdio(NULL);
if(fopen(taskname".inp","r")){freopen(taskname".inp","r",stdin);freopen(taskname".out","w",stdout);}
int t=1;
//cin>>t;
//getline(cin,s);
//Init();
while (t--){
//Init();
Enter();
Init();
Solve();
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |