全WA求调

P4114 Qtree1

Isaac_D6 @ 2024-01-13 21:35:32

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int MAXN=100005;
struct tree
{
    int l,r,lazy,sum,mx;
}t[MAXN*4];
struct node
{
    int next,to,w;
}e[MAXN*2];
int k,n,m,root,g[MAXN],res,w[MAXN],deep[MAXN],top[MAXN],head[MAXN],fa[MAXN],son[MAXN],size[MAXN],pos[MAXN],cnt;
int a[MAXN];
void add(int u,int v){ e[++k].to=v;e[k].next=head[u];head[u]=k;}
void dfs1(int u,int f,int d){
    deep[u]=d; fa[u]=f; size[u]=1;
    int mson=-114514;
    for(int i=head[u];i>0;i=e[i].next){
        int v=e[i].to;
        if(v==f) continue;
        dfs1(v,u,++d);
        size[u]+=size[v];
        if(size[v]>mson) son[u]=v,mson=size[v];
    }
}
void dfs2(long long u,long long tp){
    pos[u]=++cnt; a[cnt]=w[u]; top[u]=tp;
    if(!son[u]) return ;
    dfs2(son[u],tp);
    for(long long i=head[u];i>0;i=e[i].next){
        long long v=e[i].to;
        if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
    }
}
void upd(long long id,long long l,long long r, long long ad){
    if(t[id].l>r || t[id].r<l) return; 
    if(t[id].l>=l && t[id].r<=r){
        t[id].lazy=ad;
        t[id].sum=(t[id].r-t[id].l+1)*ad;
        return;
    }
    upd(id*2,l,r,ad); upd(id*2+1,l,r,ad);
    t[id].sum=t[id*2].sum+t[id*2+1].sum;
    t[id].mx=max(t[id*2].mx,t[id*2+1].mx);
}
long long qma(long long id , long long L , long long R)
{
    if(t[id].l>R || t[id].r<L) return -1 ;
    if(t[id].l>=L&&t[id].r<=R) return t[id].mx;
    return max(qma(id*2,L,R),qma(id*2+1,L,R)); 
}
long long tmx(long long x,long long y){
    long long ans=-1;
    while(top[x]!=top[y]){
        if(deep[top[x]]<deep[top[y]]) swap(x,y);
        ans=max(qma(1,pos[top[x]],pos[x]),ans);
        x=fa[top[x]];
    }
    if(deep[x]>deep[y])swap(x,y);
    ans=max(ans,qma(1,pos[x],pos[y]));
    return ans;
}
void build(long long id,long long l,long long r)
{
    t[id].l=l; t[id].r=r;
    if(l==r) {
        t[id].sum=a[l]; t[id].mx=a[l];
        return ;
    }
    long long mid=(l+r)>>1;
    build(id*2,l,mid); build(id*2+1,mid+1,r);
    t[id].sum=(t[id*2].sum+t[id*2+1].sum);
    t[id].mx=max(t[id*2].mx,t[id*2+1].mx);
}
signed main(){
    cin>>n;
    long long x,y,z;
    for(long long i=2;i<=n;i++) cin>>x>>y,add(x,y),add(y,x),cin>>w[x],g[x]=i;
    string que;
    dfs1(1,1,1);
    dfs2(1,1);
    build(1,1,n); 
    while(1)
    {
        cin>>que;
        if(que.size()==5){
            cin>>x>>y;
            cout<<tmx(x,y)<<endl;
        }
        if(que.size()==6){
            cin>>x>>y;
            upd(1,pos[g[x]],pos[g[x]],y);
        }
        if(que.size()==4)
        {
            return 0;
        }
    }
    return 0;
}

|