记录编号 305423 评测结果 AAAAAAAA
题目名称 大话西游 最终得分 100
用户昵称 Gravatar面对疾风吧 疾风 疾风吧 是否通过 通过
代码语言 C++ 运行时间 1.421 s
提交时间 2016-09-10 20:34:03 内存使用 19.39 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define ok 1,1,N
using namespace std;
 
const int maxn=100010*2; 
 
typedef long long LL;
 
int N,Q,cnt,len;
 
struct edge
{
       int from,to;
}e[maxn];
 
struct node
{
       int to,next;
}g[maxn*2];
 
LL mi[maxn<<1],ma[maxn<<1],A[maxn];
 
int dfn[maxn],head[maxn],la[maxn],pos[maxn],fa[maxn],sz[maxn],top[maxn],son[maxn],deep[maxn];
 
 
LL max(LL x,LL y)
{
          if(x<y)return y;
          return x;
}
 
LL min(LL x,LL y)
{
          if(x>y)return y;
          return x;
}
 
void dfs1(int x)
{
     sz[x]=1;
     
     for(int t,i=head[x];i;i=g[i].next)
     {
             t=g[i].to;
             if(!sz[t])
             {
             deep[t]=deep[x]+1;
             dfs1(t);
             sz[x]+=sz[t];
             if(sz[t]>sz[son[x]])son[x]=t;
             }
     }
}
 
void dfs2(int x,int tp)
{
     top[x]=tp;
     dfn[x]=++cnt;
     pos[cnt]=x;
     if(son[x])dfs2(son[x],tp);
     for(int t,i=head[x];i;i=g[i].next)
     {
             t=g[i].to;
             if(!dfn[t])
             dfs2(t,t);
     }
     la[x]=cnt;
}
 
void Build(int rt,int l,int r)
{
     if(l==r)
     {
           mi[rt]=ma[rt]=A[pos[l]];
           //printf("l==%d  data==%lld\n",l,A[pos[l]]);
           return;  
     }
     int mid=(l+r)>>1;
     Build(lson);
     Build(rson);
     mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);
     ma[rt]=max(ma[rt<<1],ma[rt<<1|1]);
}
void change(int rt,int l,int r,int s,LL x)
{
     if(l==r)
     {
        mi[rt]=ma[rt]=x;
        return;
     }
     int mid=(l+r)>>1;
     if(s<=mid)change(lson,s,x);
     else change(rson,s,x);
     mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);
     ma[rt]=max(ma[rt<<1],ma[rt<<1|1]);
     
}
LL queryma(int rt,int l,int r,int s,int t)
{
    if(s<=l&&t>=r)
    {
     return ma[rt];
    }
    int mid=(l+r)>>1;
    if(t<=mid)return queryma(lson,s,t);
    if(s>mid)return queryma(rson,s,t);
    return max(queryma(lson,s,t),queryma(rson,s,t));
}
 
LL querymi(int rt,int l,int r,int s,int t)
{
    if(s<=l&&t>=r)
    {
     return mi[rt];
    }
    int mid=(l+r)>>1;
    if(t<=mid)return querymi(lson,s,t);
    if(s>mid)return querymi(rson,s,t);
    return min(querymi(lson,s,t),querymi(rson,s,t));
}
 
 
void calc(int x)
{
     int ha1=e[x].from,ha2=e[x].to;
     if(dfn[ha1]>dfn[ha2])swap(ha1,ha2);
     LL ans1=0,ansmi=(1ll<<62),ansma=0;
     ans1=querymi(ok,dfn[ha2],la[ha2])*queryma(ok,dfn[ha2],la[ha2]);
         ansmi=min(querymi(ok,1,dfn[ha2]-1),ansmi);
         ansma=max(queryma(ok,1,dfn[ha2]-1),ansma);             
     if(la[ha2]!=N)
     {
         ansmi=min(querymi(ok,la[ha2]+1,N),ansmi);
         ansma=max(queryma(ok,la[ha2]+1,N),ansma);           
     }
     printf("%lld\n",ans1+ansmi*ansma);
}
 
void ADD(int x,int y)
{
    len++;
    g[len].to=y;
    g[len].next=head[x];
    head[x]=len;
}
 
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("%lld",&A[i]);
    for(int x,y,i=1;i<N;i++)
    {
            scanf("%d%d",&x,&y);
            e[i].from=x;
            e[i].to=y;
            ADD(x,y);
            ADD(y,x);    
    }
    deep[1]=1;
    dfs1(1);
    dfs2(1,1);
    Build(1,1,N);
    char s[66];
    for(int x,i=1;i<=Q;i++)
    {
            scanf("%s",s);
            if(s[0]=='C')
            {
             LL y;
             scanf("%d%lld",&x,&y);
             change(1,1,N,dfn[x],y);            
            }
            else 
            {
                 scanf("%d",&x);
                 calc(x);
            }
            
    }
    /*fclose(stdin);
    fclose(stdout);*/
    //while(1);
    return 0;
}