记录编号 593767 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [CTSC 2016]时空旅行 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 20.281 s
提交时间 2024-09-12 20:11:03 内存使用 145.42 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define fi first
#define in inline
#define se second
#define mp make_pair
#define pb push_back
const int N = 5e5+10;
const ll inf = 1e18;

ll read(){
	ll x = 0,f = 1;char c = getchar();
	for(;c < '0' || c > '9';c = getchar())if(c == '-')f = -1;
	for(;c >= '0' && c <= '9';c = getchar())x = (x<<1) + (x<<3) + c-'0';
	return x * f;
}
void cmin(ll &x,ll y){x = min(x,y);}


int n,m,c;

ll d[N],z[N],ans[N],len;
struct tubao{
	vector<int>st;
	int l = 0,r = -1;
	ll X(int x){return d[x];}
	ll Y(int x){return d[x] * d[x] + z[x];}
	ll X(int x,int y){return X(x) - X(y);}
	ll Y(int x,int y){return Y(x) - Y(y);}
	void add(int x){
		while(l < r && X(x,st[r]) * Y(st[r],st[r-1]) >= X(st[r],st[r-1]) * Y(x,st[r]))r--;
		st.pb(x),st[++r] = x;
	}
	int ask(ll k){
		while(l < r && Y(st[l+1],st[l]) <= 2ll * k * X(st[l+1],st[l]))l++;
		return l <= r ? st[l] : -1;
	}
};


vector<int>e[N];
void add(int x,int y){e[x].pb(y);}
int dfn[N],siz[N],cnt;
void dfs(int x){
	dfn[x] = ++cnt,siz[x] = 1;
	for(int y : e[x])dfs(y),siz[x] += siz[y];
}


vector<int>g[N];
struct node{int id,pos,x,z;}a[N];
bool cmp(node a,node b){return a.x == b.x ? a.id < b.id : a.x < b.x;}
struct query{int s,x,id;}q[N];
bool cmp1(query a,query b){return a.x < b.x;}

struct segment{
	tubao s[N<<2];
	void insert(int p,int l,int r,int L,int R,int x){
		if(L <= l && r <= R)return s[p].add(x),void();
		int mid = l + r >> 1;
		if(L <= mid)insert(p<<1,l,mid,L,R,x);
		if(R > mid)insert(p<<1|1,mid+1,r,L,R,x);
	}
	void ask(int p,int l,int r,query x){
		int now = s[p].ask(x.x);
		if(now != -1)cmin(ans[x.id],(ll)(x.x - d[now]) * (x.x - d[now]) + z[now]);
		if(l == r)return;
		int mid = l + r >> 1;
		if(x.s <= mid)ask(p<<1,l,mid,x);
		else ask(p<<1|1,mid+1,r,x);
	}
}t;

void modify(node x){
	d[++len] = x.x,z[len] = x.z;
	int l = dfn[x.id];
	sort(g[x.pos].begin(),g[x.pos].end(),[&](int x,int y){return dfn[x] < dfn[y];});
	for(int y : g[x.pos])t.insert(1,1,n,l,dfn[y]-1,len),l = dfn[y] + siz[y];
	if(l <= dfn[x.id] + siz[x.id] - 1)t.insert(1,1,n,l,dfn[x.id] + siz[x.id] - 1,len);
}


int main(){
	freopen("CTSC2016travel.in","r",stdin);
	freopen("CTSC2016travel.out","w",stdout);
	n = read(),m = read(),c = read();
	a[1] = {1,0,0,c};
	for(int i = 2;i <= n;i++){
		int op = read(),las = read() + 1,id = read();
		add(las,i);
		if(op)g[id].pb(i);
		else{
			int x = read(),y = read(),z = read(),val = read();
			a[i] = {i,id,x,val};
		}
	}
	dfs(1);
	sort(a+1,a+1+n,cmp);
	for(int i = 1;i <= n;i++){
		if(!a[i].id)continue;
		modify(a[i]);
	}
	for(int i = 1;i <= m;i++)q[i] = {dfn[read()+1],(int)read(),i},ans[i] = inf;
	sort(q+1,q+1+m,cmp1);
	for(int i = 1;i <= m;i++)
		t.ask(1,1,n,q[i]);
	for(int i = 1;i <= m;i++)printf("%lld\n",ans[i]);

	return 0;

}