#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e5+10;
struct qnode{
char op[3];
int x,y;
}p[N];
struct node{
int to,next;
}a[N];
int n,q,tot,cnt,ls[N],w[N],fa[N],l[N],r[N];
struct SegTree{
int w[N<<2],lazy[N<<2];
void Downdata(int x){
if(!lazy[x])return;
w[x*2]+=lazy[x];lazy[x*2]+=lazy[x];
w[x*2+1]+=lazy[x];lazy[x*2+1]+=lazy[x];
lazy[x]=0;return;
}
void Change(int x,int L,int R,int l,int r,int val){
if(L==l&&R==r){w[x]+=val;lazy[x]+=val;return;}
int mid=(L+R)>>1;Downdata(x);
if(r<=mid)Change(x*2,L,mid,l,r,val);
else if(l>mid)Change(x*2+1,mid+1,R,l,r,val);
else Change(x*2,L,mid,l,mid,val),Change(x*2+1,mid+1,R,mid+1,r,val);
w[x]=max(w[x*2],w[x*2+1]);return;
}
int Ask(int x,int L,int R,int l,int r){
if(L==l&&R==r){return w[x];}
int mid=(L+R)>>1;Downdata(x);
if(r<=mid)return Ask(x*2,L,mid,l,r);
if(l>mid)return Ask(x*2+1,mid+1,R,l,r);
return max(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));
}
}T;
void addl(int x,int y){
if(x==y)return;
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;return;
}
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void dfs(int x){
l[x]=r[x]=++cnt;T.Change(1,1,n,cnt,cnt,w[x]);
for(int i=ls[x];i;i=a[i].next)
dfs(a[i].to);
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]),fa[i]=i;
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%s",p[i].op);
if(p[i].op[0]=='U'){
scanf("%d%d",&p[i].x,&p[i].y);
p[i].x=find(p[i].x);p[i].y=find(p[i].y);
if(p[i].x==p[i].y)continue;
if(p[i].x<p[i].y)swap(p[i].x,p[i].y);
fa[p[i].y]=p[i].x;
}
else if(p[i].op[0]=='A'&&p[i].op[1]=='1')
scanf("%d%d",&p[i].x,&p[i].y);
else if(p[i].op[0]=='A'&&p[i].op[1]=='2')
scanf("%d%d",&p[i].x,&p[i].y);
else if(p[i].op[0]!='F'||p[i].op[1]!='3')
scanf("%d",&p[i].x);
}
for(int i=q;i>=1;i--)
if(p[i].op[0]=='U')addl(p[i].x,p[i].y);
for(int i=1;i<=n;i++)
if(find(i)==i)dfs(i);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=q;i++){
int x=p[i].x,y=p[i].y;
if(p[i].op[0]=='U'){
if(x==y)continue;
fa[y]=x;r[x]=r[y];
}
else if(p[i].op[0]=='A'&&p[i].op[1]=='1')
T.Change(1,1,n,l[x],l[x],y);
else if(p[i].op[0]=='A'&&p[i].op[1]=='2')
x=find(x),T.Change(1,1,n,l[x],r[x],y);
else if(p[i].op[0]=='A'&&p[i].op[1]=='3')
T.Change(1,1,n,1,n,x);
else if(p[i].op[0]=='F'&&p[i].op[1]=='1')
printf("%d\n",T.Ask(1,1,n,l[x],l[x]));
else if(p[i].op[0]=='F'&&p[i].op[1]=='2')
x=find(x),printf("%d\n",T.Ask(1,1,n,l[x],r[x]));
else printf("%d\n",T.Ask(1,1,n,1,n));
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构