美好的下午,从开始调树上主席树被打破
查看原帖
美好的下午,从开始调树上主席树被打破
342584
流夏的美楼主2021/2/4 15:08

哪位大佬能来帮忙看一下QAQ,疯狂re,离散化也换了好几个了,死活调不出来

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
const int N = 1e6 + 5;

struct line_tree {
	int l, r, val;
} t[N << 5];

struct node {
	int pre, to;
} g[N << 2];

int n, m, cnt, num, lastans, top;
int val[N], d[N], fa[N], dfn[N], rk[N], f[N][41], root[N], pr[N], b[N];

void ini() {
	std :: sort(b + 1, b + 1 + n);
	for(int i = 1; i <= n; ++i)
		if(b[i] != b[i - 1]) b[++top] = b[i];
	return ; 
}

int getid(int val) {
	int l = 1, r = top, mid, ans;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if(b[mid] == val) return mid;
		if(b[mid] > val) r = mid - 1;
		else l = mid + 1;
	}
}

int ins(int x, int l, int r, int now, int old, int val) {
	if(!now) now = ++num;
	t[now] = t[old];
	t[now].val += 1;
	if(l == r) return now;
	int mid = (l + r) >> 1;
	if(mid >= x) t[now].l = ins(x, l, mid, t[now].l, t[old].l, val);
	else t[now].r = ins(x, mid + 1, r, t[now].r, t[old].r, val);
	return now;
}

void dfs(int u, int dep) {
	root[u] = ins(val[u], 1, n, root[u], root[fa[u]], 1);
	d[u] = dep;
	for(int i = pr[u]; i; i = g[i].pre) {
		int p = g[i].to;
		if(p == fa[u]) continue;
		fa[p] = u;
		dfs(p, dep + 1);
	}
	return ;
}

void st() {
	for(int i = 1; i <= n; ++i)
		f[i][0] = fa[i];
	for(int j = 1; j <= 31; ++j)
		for(int i = 1; i <= n; ++i)
			f[i][j] = f[f[i][j - 1]][j - 1];
	return ;
}

int lca(int x, int y) {
	if(d[x] < d[y]) std :: swap(x, y);
	for(int i = 40; i >= 0; --i) {
		if(d[x] - (1ll << i) >= d[y])
			x = f[x][i];
	}
	if(x == y) return x;
	for(int i = 40; i >= 0; --i) {
		if(f[x][i] != f[y][i]) {
			x = f[x][i];
			y = f[y][i];
		}
	}
	return f[x][0];
}

void add(int fa, int child) {
	g[++cnt].pre = pr[fa];
	g[cnt].to = child;
	pr[fa] = cnt;
	return ;
}

int Que(int l, int r, int a, int b, int c, int d, int k) {
	if(l == r) return l;
	int mid = (l + r) >> 1;
	int s = t[t[a].l].val + t[t[b].l].val - t[t[c].l].val - t[t[d].l].val;
	if(s >= k) return Que(l, mid, t[a].l, t[b].l, t[c].l, t[d].l, k);
	else return Que(mid + 1, r, t[a].r, t[b].r, t[c].r, t[d].r, k - s);
}

signed main() {
	std :: ios :: sync_with_stdio(false);
	std :: cin >> n >> m;
	for(int i = 1; i <= n; ++i)
		std :: cin >> val[i], b[i] = val[i];
	ini();
	for(int i = 1; i <= n; ++i)
		val[i] = getid(val[i]);
	int x, y, k;
	for(int i = 1; i <= n - 1; ++i) {
		std :: cin >> x >> y;
		add(x, y), add(y, x);
	}
	dfs(1, 1);
	st();
	for(int i = 1; i <= m; ++i) {
		std :: cin >> x >> y >> k;
		x ^= lastans;
		int t = lca(x, y);
		lastans = b[Que(1, n, root[x], root[y], root[t], root[fa[t]], k)];
		std :: cout << lastans << '\n';
	}
	return 0;
}

果然紫题得紫

2021/2/4 15:08
加载中...