比赛 |
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;
}