#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100],S,n,c[100],sum,b[800000],ans1,ans2;
map<ll,ll>mp;
int main()
{
scanf("%d%lld",&n,&S);
for(register int i=1; i<=n; ++i)
{
scanf("%lld",&a[i]);
}
int mid=n>>1;
for (int i=0; i<(1<<mid); i++)
{
sum=0;
for (int j=0; j<mid; j++)
{
if ((i>>j)&1)
{
sum+=a[mid-j];
}
}
if (S>=sum)
{
mp[S-sum]=i+1;
}
}
int nn=n-mid;
for (int i=0; i<(1<<nn); i++)
{
sum=0;
for (int j=0; j<n-mid; j++)
{
if ((i>>j)&1)
{
sum+=a[n-j];
}
}
if (mp[sum]>0)
{
ans1=mp[sum]-1;
ans2=i;
break;
}
}
for (int i=0; i<mid; i++)
{
if ((ans1>>i)&1)
{
c[mid-i]=1;
}
}
for (int i=0; i<n-mid; i++)
{
if ((ans2>>i)&1)
{
c[n-i]=1;
}
}
for (int i=1; i<=n; i++)
{
printf("%d",c[i]);
}
printf("\n");
}
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=100100;
ull c2,c4,tmp,a,b;
int f[maxn],siz[maxn],n,m,kk;
int get_f(int x)
{
return x==f[x]?x:f[x]=get_f(f[x]);
}
void merge1(int x,int y)
{
if (siz[x]>siz[y])
{
f[y]=x;
siz[x]+=siz[y];
}
else
{
f[x]=y;
siz[y]+=siz[x];
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++)
{
siz[i]=1;
f[i]=i;
}
c2=1ull*n*(n-1)/2;
c4=1ull*n*(n-1)/2*(n-2)/3*(n-3)/4;
printf("%llu\n",c4);
for (int i=1; i<=m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
x=get_f(x);
y=get_f(y);
if (n-kk<4)
{
printf("0\n");
continue;
}
if (x==y)
{
printf("%llu\n",c4);
continue;
}
kk++;
a=siz[y];
b=siz[x];
c2-=a*b;
tmp=a*b*(c2-(a+b)*(n-a-b));
c4-=tmp;
printf("%llu\n",max(0ull,c4));
merge1(x,y);
}
}