1 solutions
-
0
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