Submission #1284376

#TimeUsernameProblemLanguageResultExecution timeMemory
1284376Hurryup_7735Birthday gift (IZhO18_treearray)C++20
0 / 100
4 ms24124 KiB
//In The Name Of ALLAH! #pragma GCC optimize("O3") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; #define ll long long #define ld long double #define endl '\n' #define pb push_back #define pf push_front #define Zemur007 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); #define bpc __builtin_popcountll #define btz __builtin_ctzll #define all(x) x.begin() , x.end() #define allr(x) x.rbegin() , x.rend() #define F first #define S second #define pll pair<ll , ll> #define turtle tuple<ll , ll , ll> #define pss pair<string , string> #define YES cout << "YES" << endl; #define NO cout << "NO" << endl; #define indexed_set tree<pll , null_type , less<pll> , rb_tree_tag , tree_order_statistics_node_update> const ll sz = 2e5 + 5 , INF = 1e18 , MOD = 1e9 + 7; ll a[sz] , st[sz<<2]; vector<ll> g[sz]; ll par[sz][20] , lvl[sz]; bool used[sz]; void dfs(ll n , ll p){ used[n] = 1; par[n][0] = p; lvl[n] = lvl[p] + 1; for(ll i = 1 ; i < 20 ; i++){ par[n][i] = par[par[n][i - 1]][i - 1]; } for(ll i : g[n]){ if(!used[i]){ dfs(i , n); } } } ll LCA(ll x , ll y){ if(lvl[x] < lvl[y]) swap(x , y); for(ll i = 19 ; i >= 0 ; i--){ if(lvl[x] - (1 << i) >= lvl[y]){ x = par[x][i]; } } if(x == y) return x; for(ll i = 19 ; i >= 0 ; i--){ if(par[x][i] != par[y][i]){ x = par[x][i]; y = par[y][i]; } } return par[x][0]; } void build(ll l , ll r , ll in){ if(l == r){ st[in] = a[l]; return; } ll mid = (l + r) >> 1; build(l , mid , in<<1); build(mid + 1 , r , in<<1|1); st[in] = LCA(st[in<<1] , st[in<<1|1]); } void update(ll x , ll val , ll l , ll r , ll in){ if(x > r || x < l) return; if(l == r){ st[in] = val; return; } ll mid = (l + r) >> 1; update(x , val , l , mid , in<<1); update(x , val , mid + 1 , r , in<<1|1); st[in] = LCA(st[in<<1] , st[in<<1|1]); } ll getans(ll a , ll b , ll l , ll r , ll in){ if(a > r || l > b) return -1; if(a <= l && r <= b){ return st[in]; } ll mid = (l + r) >> 1; if(getans(a , b , l , mid , in<<1) == -1) return getans(a , b , mid + 1 , r , in<<1|1); else if(getans(a , b , mid + 1 , r , in<<1|1) == -1) return getans(a , b , l , mid , in<<1); return LCA(getans(a , b , l , mid , in<<1) , getans(a , b , mid + 1 , r , in<<1|1)); } ll mask , i , j , k; void solve(){ ll n , m , q; cin >> n >> m >> q; for(i = 1 ; i < n ; i++){ ll u , v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } dfs(1 , 0); for(i = 1 ; i <= m ; i++) cin >> a[i]; build(1 , m , 1); while(q--){ ll op; cin >> op; if(op == 1){ ll x , val; cin >> x >> val; a[x] = val; update(x , val , 1 , m , 1); } //4 5 5 3 //2 3 4 5 else{ ll x , y , val; cin >> x >> y >> val; ll idxa = -1 , idxb = -1; ll l = 1 , r = y - x + 1; bool ok = false; while(l <= r){ ll mid = (l + r) >> 1; for(i = x + mid ; i <= y + 1 ; i++){ if(getans(i - mid , i - 1, 1 , m , 1) == val){ ok = true; idxa = i - mid; idxb = i - 1; break; } } if(ok || mid == 1) break; else r = mid - 1; } cout << idxa << ' ' << idxb << endl; } } } signed main(){ Zemur007; //open; ll t = 1; // cin >> t; while(t--){ solve(); } // for(ll testcase = 1 ; testcase <= t ; testcase++){ // cout << "Case " << testcase << ":" << endl; // solve(); // } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...