#include <bits/stdc++.h>
using namespace std;
#define int long long
//namespace MODTool {
// const int MOD = 1e9+7;
// inline int ADD(int a,int b) {
// return a+b>MOD?a+b-MOD:a+b;
// }
// inline int MUL(int a,int b) {
// return (a%MOD * (b%MOD))%MOD;
// }
//}
namespace Larry76 {
inline int read() {
int x=0,f=1;
char ch = getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>'0'&&ch<'9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
const int INF = 0x7fffffffffffffffll;
const int MAX_SIZE = 3e5;
int head[MAX_SIZE];
int Next[MAX_SIZE];
int ver[MAX_SIZE];
int tot;
int n,k,m;
void add(int u,int v) {
ver[++tot] = v;
Next[tot] = head[u];
head[u] = tot;
}
struct SegmentTree {
int max = INF;
int ptr = INF;
};
SegmentTree min(const SegmentTree &a,const SegmentTree &b) {
if(a.max == b.max) {
return a.ptr < b.ptr ? a:b;
}
return a.max<b.max ? a:b;
}
SegmentTree seg[MAX_SIZE<<2];
inline void pushup(int p) {
seg[p] = min(seg[p<<1],seg[p<<1|1]);
}
void build(int p,int l,int r) {
if(l==r) {
seg[p].max = 0;
seg[p].ptr = l;
return ;
}
int mid = (l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void update(int p,int l,int r,int x,int val) {
if(l==r) {
seg[p].max = val;
return;
}
int mid = (l+r)>>1;
if(x<=mid)
update(p<<1,l,mid,x,val);
else
update(p<<1|1,mid+1,r,x,val);
pushup(p);
}
SegmentTree query(int p,int tl,int tr,int l,int r) {
if(l<=tl&&r>=tr)
return seg[p];
int mid = (tl+tr)>>1;
SegmentTree val;
if(l<=mid)
val = min(val,query(p<<1,tl,mid,l,r));
if(r>mid)
val = min(val,query(p<<1|1,mid+1,tr,l,r));
return val;
}
priority_queue <int> qwq[MAX_SIZE];
int dfn[MAX_SIZE];
int siz[MAX_SIZE];
int rev[MAX_SIZE];
int tim = 0;
void dfs(int u,int fa) {
dfn[u] = ++tim;
rev[tim] = u;
siz[u] = 1;
for(int i=head[u]; i; i=Next[i]) {
int v = ver[i];
if(v==fa)
continue;
dfs(v,u);
siz[u] += siz[v];
}
}
int f[MAX_SIZE];
void ddp(int u,int fa) {
int v = 0;
for(int i=head[u]; i; i=Next[i]) {
v = ver[i];
if(v==fa)
continue;
ddp(v,u);
}
update(1,1,tim,dfn[u],f[u]);
priority_queue<int> buff = qwq[u];
if(buff.empty())
return;
f[u] = buff.top();
update(1,1,tim,dfn[u],f[u]);
buff.pop();
if(siz[u]==1)
return;
while(!buff.empty()) {
SegmentTree buffer = query(1,1,n,dfn[u]+1,dfn[u]+siz[u]-1);
if(buffer.max>=buff.top())
break;
update(1, 1, n, buffer.ptr, buff.top());
f[rev[buffer.ptr]] = buff.top();
buff.pop();
}
}
void main() {
//Code Here
int sid;
cin>>sid;
cin>>n>>k>>m;
int fa;
for(int i=2; i<=n; i++) {
cin>>fa;
add(i,fa);
add(fa,i);
}
build(1,1,n);
int x,v;
for(int i=1; i<=k; i++) {
cin>>x>>v;
qwq[x].push(v);
}
dfs(1,1);
ddp(1,1);
int ans = 0;
for(int i=1; i<=n; i++)
ans += f[i];
cout<<ans<<' ';
while(m--){
int opt,pos;
cin>>opt>>pos;
if(opt==2){
cerr<<"QAQ Unhuiable"<<endl;
cout<<ans<<' ';
} else {
int vv;
cin>>vv;
qwq[pos].push(vv);
build(1,1,n);
memset(f,0,sizeof f);
ddp(1,1);
ans = 0;
for(int i=1; i<=n; i++)
ans += f[i];
cout<<ans<<' ';//warn
}
}
return;
}
}
signed main() {
//#ifndef LOCAL
// freopen("transfer.in","r",stdin);
// freopen("transfer.out","w",stdout);//File name !!
//#endif
time_t t1 = clock();
Larry76::main();
time_t t2 = clock();
cerr<<t2-t1<<endl;
return (0^0);
}
如题,本地编译能过且程序正常运行,提交到本题上和洛谷在线 IDE 上全部 Compile Error,期间更换过 C++14(GCC 9)、C++14 和 C++20 全部报错,请求路过的大神们支援一下,在这里万分感谢