Submission #245656

# Submission time Handle Problem Language Result Execution time Memory
245656 2020-07-07T04:29:53 Z Yera Birthday gift (IZhO18_treearray) C++17
0 / 100
32 ms 45056 KB
// In The Name Of God
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <bitset>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
 
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define sagyndym_seni ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
 
const ll N = 2e5+5, p1 = 911382323, p2 = 972663749, INF = 1e9+123;
 
inline int read(){
	char c = getchar_unlocked();
	bool minus = 0;
	while (c < '0' || '9' < c){
		if(c == '-'){ minus = 1;}
		c = getchar_unlocked();
		if(c == '-'){ minus = 1;}
	}
	int res = 0;
	while ('0' <= c && c <= '9') {
		res = (res << 3) + (res << 1) + c - '0';
		c = getchar_unlocked();
	}
	if(minus){ res = (~res) + 1;}
	return res;
}
 
int n, m, q, tick = 0;
int depth[N], pos[N], LOG[N], inv[N], ans[N], was[N];
pair<int, int> st[N][30];
vector<int> vec, g[N];
vector<pair<int, int>> order;
 
void dfs(int v, int p){
	order.pb({depth[v], v});
	pos[v] = sz(order)-1;
 
	for(auto to : g[v]){
		if(to == p){ continue;}
		depth[to] = depth[v] + 1;
		dfs(to, v);
		order.pb({depth[v], v});
	}
}
 
inline void precalc(){
	LOG[1] = 0;
	for(int i = 2; i < N; i++){
		LOG[i] = LOG[i >> 1] + 1;
	}
	for(int i = 0; i < sz(order); i++){
		st[i][0] = order[i];
	}
	for(int j = 1; j < 30; j++){
		for(int i = 0; i + (1 << j) < sz(order); i++){
			st[i][j] = min(st[i][j-1], st[i + (1 << (j-1))][j-1]);
		}
	}
}
 
inline int mn(int l, int r){
	if(r < l){ swap(l, r);}
	int j = LOG[r - l + 1];
	pair<int, int> res = min(st[l][j], st[r - (1 << j) + 1][j]);
	return res.s;
}

multiset<pair<int, int>> t[N << 2];

void build(int v, int vl, int vr){
	if(vl == vr){
		int val = vl == m - 1 ? -1 : mn(pos[vec[vl]], pos[vec[vl + 1]]);
		t[v].insert({val, vl});
		return;
	}
	int vm = (vl + vr) >> 1;
	build(v*2+1, vl, vm);
	build(v*2+2, vm+1, vr);
	merge(all(t[v*2+1]), all(t[v*2+2]), inserter(t[v], t[v].begin()));
}

void modify(int v, int vl, int vr, int idx, int old_val, int new_val){
	auto it = t[v].find({old_val, idx});
	if(it != t[v].end()){ t[v].erase(it);}
	t[v].insert({new_val, idx});
	if(vl != vr){
		int vm = (vl + vr) >> 1;
		if(idx <= vm){
			modify(v*2+1, vl, vm, idx, old_val, new_val);
		}else{
			modify(v*2+2, vm+1, vr, idx, old_val, new_val);
		}
	}
}

int query(int v, int vl, int vr, int l, int r, int val){
	if(l > vr || r < vl || r < l){ return -1;}
	if(l <= vl && vr <= r){
		auto it = t[v].lower_bound({val, -1});
		if(it == t[v].end()){ return -1;}
		pair<int, int> temp = *it;
		return temp.f == val ? temp.s : -1;
	}
	int vm = (vl + vr) >> 1;
	int q = query(v*2+1, vl, vm, l, r, val);
	if(q != -1){ return q;}
	return query(v*2+2, vm+1, vr, l, r, val);
}

int main(){
	n = read(); m = read(); q = read();
	vec.resize(m);
	fill(inv, inv + N, -1);
	fill(was, was + N, -1);
	for(int i = 1; i < n; i++){
		int v = read()-1, u = read()-1;
		g[v].pb(u);
		g[u].pb(v);
	}
	for(int i = 0; i < m; i++){
		vec[i] = read()-1;
		was[vec[i]] = i;
	}
	dfs(0, 0);
	precalc();
	build(0, 0, m - 1);
	while(q--){
		int tp = read()-1;
		if(!tp){
			int p = read()-1, v = read()-1;
			if(p != m - 1){
				modify(0, 0, m - 1, p, mn(pos[vec[p]], pos[vec[p + 1]]), mn(pos[v], pos[vec[p + 1]]));
			}
			if(p != 0){
				modify(0, 0, m - 1, p - 1, mn(pos[vec[p-1]], pos[vec[p]]), mn(pos[v], pos[vec[p-1]]));
			}
			was[vec[p]] = -1; vec[p] = v; was[vec[p]] = p;
		}else{
			int l = read()-1, r = read()-1, p = read()-1;
			if(l <= was[p] && was[p] <= r){ cout<<'\n'<<was[p]+1<<' '<<was[p]+1; continue;}
			int res = query(0, 0, m - 1, l, r - 1, p);
			res == -1 ? cout<<"\n-1 -1" : cout<<'\n'<<res + 1<<' '<<res + 2;
		}
	}
	return 0;
}
/* TIMUS: 292220YC*/
# Verdict Execution time Memory Grader output
1 Correct 32 ms 44928 KB n=5
2 Incorrect 31 ms 45056 KB Jury has the answer but participant has not
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 32 ms 44928 KB n=5
2 Incorrect 31 ms 45056 KB Jury has the answer but participant has not
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 32 ms 44928 KB n=5
2 Incorrect 31 ms 45056 KB Jury has the answer but participant has not
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 32 ms 44928 KB n=5
2 Incorrect 31 ms 45056 KB Jury has the answer but participant has not
3 Halted 0 ms 0 KB -