RT,人麻了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5;
int n,m;
ll val[N*2+5];
struct EDGE{
int u,v;
ll w;
}edge[N+5];
int cnt=0;
void add(int u,int v,int w)
{
edge[++cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
}
int f[N*2+5],fa[N*2+5][20];
int find(int x)
{
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
int jd,W[N*2+5];
bool cmp(EDGE x,EDGE y) {return x.w<y.w;}
void kruskal()//重构树
{
jd=n;
sort(edge+1,edge+1+m,cmp);
for(int i=1;i<=m;i++)
{
int x=find(edge[i].u),y=find(edge[i].v);
if(x!=y)
{
jd++;
f[x]=f[y]=jd;
fa[x][0]=fa[y][0]=jd;
val[jd]=val[x]+val[y];
W[jd]=edge[i].w;
}
}
int k=log(jd)/log(2);
for(int i=1;i<=jd;i++)
for(int j=1;j<=k;j++)
fa[i][j]=fa[fa[i][j-1]][j-1];
for(int i=1;i<=n;i++)
{
int x=i;
while(1)
{
ll sum=val[x];
for(int j=k;j>=0;j--)
{
if(!fa[x][j]||sum<W[fa[x][j]]) continue;
x=fa[x][j];
break;
}
if(sum==val[x]) break;//跳不动了
}
printf("%d",fa[x][0]==0?1:0);
}
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
val[i]=1ll*read();
f[i]=i;
f[i+n]=i+n;
}
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y,max(val[x],val[y]));
}
kruskal();
return 0;
}
大佬求调QAQ