1 solutions

  • 0
    @ 2025-11-5 16:03:29

    C++ :

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <cstdio>
     
    using namespace std;
     
    const int oo=5000000;
     
    struct node
    {
        int maxv,sumv,v;
        bool isroot;
        node *c[2],*f;
    }P[50005],*null;
     
    void update(node *p)
    {
        p->maxv = p->v;
        if (p->c[0]->maxv > p->maxv) p->maxv = p->c[0]->maxv;
        if (p->c[1]->maxv > p->maxv) p->maxv = p->c[1]->maxv;
        p->sumv = p->c[0]->sumv + p->c[1]->sumv + p->v;
    }
     
    void rot(node *p,int o)
    {
        node *q=p->f;
        q->c[o]=p->c[!o];
        p->c[!o]->f=q;
        p->c[!o]=q;
        p->f=q->f;
        if (q==p->f->c[o]) p->f->c[o]=p;
        if (q==p->f->c[!o]) p->f->c[!o]=p;
        q->f=p;
        update(q);
        p->isroot=q->isroot;
        q->isroot=false;
    }
     
    void splay(node *p)
    {
        while (!p->isroot)
        {
            if (p->f->isroot)
            {
                if (p->f->c[0]==p) rot(p,0);
                else rot(p,1);
            }
            else
            {
                if (p->f->f->c[0]==p->f)
                {
                    if (p->f->c[0]==p) rot(p->f,0),rot(p,0);
                    else rot(p,1),rot(p,0);
                }
                else
                {
                    if (p->f->c[1]==p) rot(p->f,1),rot(p,1);
                    else rot(p,0),rot(p,1);
                }
            }
        }
        update(p);
    }
     
    void access(node *p)
    {
        node *q=null,*t=p;
        do
        {
            splay(p);
            p->c[1]->isroot=true;
            p->c[1]=q;
            q->isroot=false;
            update(p);
            q=p;
            p=p->f;
        }while(p!=null);
        splay(t);
    }
     
    int maxv,sumv,n;
     
    void ansess(node *p)
    {
        node *q=null,*t=p;
        do
        {
            splay(p);
            if (p->f==null)
            {
                sumv=p->c[1]->sumv+q->sumv+p->v;
                maxv=max(p->c[1]->maxv,q->maxv);
                maxv=max(p->v,maxv);
            }
            p->c[1]->isroot=true;
            p->c[1]=q;
            q->isroot=false;
            update(p);
            q=p;
            p=p->f;
        }while(p!=null);
        splay(t);
    }
     
    void change(node *p,int v)
    {
        splay(p);
        p->v=v;
        update(p);
    }
     
    void qmax(int u,int v)
    {
        access(P+u);
        ansess(P+v);
        printf("%d\n",maxv);
    }
     
    void qsum(int u,int v)
    {
        access(P+u);
        ansess(P+v);
        printf("%d\n",sumv);
    }
     
    struct edge
    {
        int t;
        edge *next;
    }E[100005],*V[50005];
    int eh;
    inline void addedge(int &a,int &b)
    {
        E[++eh].next=V[a];  V[a]=E+eh;  V[a]->t=b;
        E[++eh].next=V[b];  V[b]=E+eh;  V[b]->t=a;
    }
     
    void maketree(int u)
    {
        for (edge *e=V[u];e;e=e->next)
        if (P+e->t!=P[u].f)
        {
            P[e->t].f=P+u;
            maketree(e->t);
        }
    }
     
    void init()
    {
        null=P+50003;
        null->sumv=null->v=0;null->maxv=-oo;
        null->c[0]=null->c[1]=null->f=null;
        scanf("%d",&n);
        int a,b;
        for (int i=1;i<n;i++) scanf("%d%d",&a,&b),addedge(a,b);
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&P[i].v);
            P[i].sumv=P[i].maxv=P[i].v;
            P[i].c[0]=P[i].c[1]=P[i].f=null;
            P[i].isroot=true;
        }
        maketree(1);
    }
     
    char st[10];
     
    int main()
    {
        init();
        int Q,a,b;
        scanf("%d",&Q);
        for (;Q;--Q)
        {
            scanf("%s%d%d",st,&a,&b);
            if (st[0]=='C') change(P+a,b);
            else if (st[1]=='M') qmax(a,b);
            else qsum(a,b);
        }
    
        return 0;
    }
    
    • 1

    Information

    ID
    17469
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By