#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define f1(i,n) for(int i=1;i<=n;i++)
#define __file_name ""
using namespace std;
const ll maxn=1e6+5, inf=1e18;
const int LG = 18;
struct FenwickTree{
int n;
vector<ll> bit;
void init(int n_){
n = n_;
bit.resize(n + 1, 0);
}
void update(int idx, ll v){
for(;idx<=n;idx+=idx&-idx) bit[idx] += v;
}
ll getSum(int idx){
ll s = 0;
for(;idx>0;idx-=idx&-idx) s += bit[idx];
return s;
}
int walk(ll v){
ll s = 0, pos = 0;
int lg = __lg(n);
for(int i = lg; i >= 0; i--){
if(pos + (1 << i) < n && s + bit[pos + (1 << i)] < v){
pos += (1 << i);
s += bit[pos];
}
}
return pos + 1;
}
};
int n, k, c[maxn], s[maxn], poss[maxn], optp[maxn];
FenwickTree st, ft;
int L = 1, R = 0;
ll dp[maxn], pf[maxn];
int ST[LG][maxn];
void add(int i){
int pos = poss[i];
ft.update(pos, 1);
st.update(pos, s[i]);
}
void del(int i){
int pos = poss[i];
ft.update(pos, -1);
st.update(pos, -s[i]);
}
ll getVal(int l, int r){
if(r - l + 1 < k) return -2*inf;
while(l < L) add(--L);
while(R < r) add(++R);
while(l > L) del(L++);
while(R > r) del(R--);
int idx = ft.walk(k);
return st.getSum(idx) - pf[r] + pf[l - 1];
}
void solve(int l, int r, int optl, int optr){
if(l > r) return;
int idx = (l + r) / 2;
ll valdp = -inf;
int opt = 1;
for(int i = optl; i <= optr && i <= idx; i++){
ll vdp = getVal(i, idx);
if(vdp >= valdp){
valdp = vdp;
opt = i;
}
}
dp[idx] = valdp;
optp[idx] = opt;
solve(l, idx - 1, optl, opt);
solve(idx + 1, r, opt, optr);
}
void updMin(int l, int r, int x){
int b = __lg(r - l + 1);
ST[b][l] = min(ST[b][l], x);
ST[b][r - (1 << b) + 1] = min(ST[b][r - (1 << b) + 1], x);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if(fopen(__file_name ".inp", "r")){
freopen(__file_name ".inp", "r", stdin);
freopen(__file_name ".out", "w", stdout);
}
cin >> n >> k;
f1(i,n) {
cin >> c[i];
pf[i] = pf[i-1] + c[i];
}
vector<pair<int,int>> vs;
f1(i,n) {
cin >> s[i];
vs.push_back({s[i], i});
}
sort(vs.begin(), vs.end(), greater<pair<int,int>>());
vs.insert(vs.begin(), {0, 0});
f1(i,n){
poss[vs[i].second] = i;
}
st.init(n); ft.init(n);
solve(1, n, 1, n);
for(int b = 0; b < LG; b++) f1(i,n) ST[b][i] = 1e9+7;
optp[0] = 1;
ll ans = *max_element(dp+1,dp+n+1);
int j = 1;
f1(i,n){
if(dp[i] != ans) continue;
for(; j <= optp[i]; j++){
ll x = getVal(j, i);
if(x == ans){
int idx = ft.walk(k);
updMin(j, i, vs[idx].first);
}
}
j--;
}
for(int b = LG - 1; b > 0; b--){
f1(i,n){
ST[b-1][i] = min(ST[b-1][i], ST[b][i]);
int j = i + (1 << (b - 1));
ST[b-1][j] = min(ST[b-1][j], ST[b][i]);
}
}
cout << ans << '\n';
f1(i,n) cout << "01"[ST[0][i] <= s[i]];
return 0;
}