比赛 20241021 评测结果 AAAAAAAA
题目名称 大话西游 最终得分 100
用户昵称 小金 运行时间 0.424 s
代码语言 C++ 内存使用 6.83 MiB
提交时间 2024-10-21 11:49:04
显示代码纯文本
#include<iostream>
#include<cstdio> 
using namespace std;
const int N=200010;
int n,q,num;
int a[N],siz[N],id[N],dfn[N],pre[N];
struct node{
    int to;
    int th;
    int ne;
}e[N];
int h[N],tot=1;
struct data{
    int l,r;
    int mn,mx;
}t[N<<2];
char s[10];    
void add(int x,int y,int now) 
{
	tot++;
    e[tot].to=y;
    e[tot].th=now;
    e[tot].ne=h[x];
    h[x]=tot;
}    
void dfs(int now,int fa) 
{
    siz[now]=1;
    num++; 
	dfn[now]=num;
	id[num]=now;
    for(int i=h[now];i;i=e[i].ne) 
	{
        int to=e[i].to;
        if(to==fa) continue;
        pre[e[i].th]=to;
        dfs(to,now);
        siz[now]+=siz[to];
    }
}
void build(int now,int l,int r) 
{
    t[now].l=l;
	t[now].r=r;
    if(l==r) 
	{
        t[now].mn=a[id[l]];
		t[now].mx=a[id[l]];
        return;
    }
    int mid=(r+l)>>1;
    build(now<<1,l,mid);
    build(now<<1|1,mid+1,r);
    t[now].mn=min(t[now<<1].mn,t[now<<1|1].mn);
    t[now].mx=max(t[now<<1].mx,t[now<<1|1].mx);
}
void modify(int now,int x,int val) 
{
    if(t[now].l==t[now].r) 
	{
        t[now].mn=t[now].mx=val;
        return;
    }
    int mid=(t[now].l+t[now].r)>>1;
    if(x<=mid) modify(now<<1,x,val);
    if(x>mid) modify(now<<1|1,x,val);
    t[now].mn=min(t[now<<1].mn,t[now<<1|1].mn);
    t[now].mx=max(t[now<<1].mx,t[now<<1|1].mx);
}
int askmn(int now,int l,int r) 
{
    if(l<=t[now].l&&r>=t[now].r) return t[now].mn;
    int mn1=1e9,mn2=1e9;
    int mid=(t[now].l+t[now].r)>>1;
    if(l<=mid) mn1=min(mn1,askmn(now<<1,l,r));
    if(r>mid) mn2=min(mn2,askmn(now<<1|1,l,r));
    return min(mn1,mn2);
}
int askmx(int now,int l,int r) 
{
    if(l<=t[now].l&&r>=t[now].r) return t[now].mx;
    int mx1=-1,mx2=-1;
    int mid=(t[now].l+t[now].r)>>1;
    if(l<=mid) mx1=max(mx1,askmx(now<<1,l,r));
    if(r>mid) mx2=max(mx2,askmx(now<<1|1,l,r));
    return max(mx1,mx2);
}
int main() 
{
    freopen("westward.in","r",stdin);
    freopen("westward.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<n;i++) 
	{
	    int x,y;
        scanf("%d%d",&x,&y);
        add(x,y,i);
		add(y,x,i);
    }
    dfs(1,0); 
    build(1,1,n);
    for(int i=1;i<=q;i++) 
	{
        scanf("%s",s);
        if(s[0]=='C') 
		{
			int x,y;
            scanf("%d%d",&x,&y);
            modify(1,dfn[x],y);
        }
        else 
		{
			int x;
            scanf("%d",&x);
            int l=dfn[pre[x]],r=l+siz[pre[x]]-1;
            int min1=askmn(1,l,r),max1=askmx(1,l,r);
            int min2,max2;
            if(l!=1)
			{
				min2=askmn(1,1,l-1);
				max2=askmx(1,1,l-1);
			} 
            if(r!=n)
			{
				min2=min(min2,(askmn(1,r+1,n)));
				max2=max(max2,askmx(1,r+1,n));
			} 
            long long ans=(long long)min1*(long long)max1+(long long)min2*(long long)max2;
            printf("%lld\n",ans);
        }
    }
    return 0;
}