#include <bits/stdc++.h>
using namespace std;
const int maxn = 300000 + 123;
struct Tlevel {
  int a, b, idx;
  bool operator<(const Tlevel& a) const { return b < a.b; }
};
Tlevel levels[maxn];
long long nsum = 0;
long long tsum = 0;
multiset<int> S;
long long minn;
int ap;
vector<pair<int, int> > vans;
int n, w;
int ans[maxn];
int main() {
  scanf("%d%d", &n, &w);
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &levels[i].a, &levels[i].b);
    S.insert(-levels[i].a);
    levels[i].idx = i;
  }
  sort(levels, levels + n);
  while (S.size() > w) S.erase(S.begin());
  for (auto it = S.begin(); it != S.end(); ++it) nsum -= *it;
  if (S.size() == w)
    minn = nsum;
  else
    minn = -1;
  ap = -1;
  tsum = 0;
  for (int i = 0; i < n; ++i) {
    tsum += levels[i].a;
    S.insert(levels[i].a - levels[i].b);
    nsum += levels[i].b - levels[i].a;
    auto it = S.find(-levels[i].a);
    if (it != S.end()) {
      nsum -= levels[i].a;
      S.erase(it);
    }
    while (S.size() > w - i - 1) {
      nsum += *S.begin();
      S.erase(S.begin());
    }
    if (S.size() == w - i - 1 && (minn == -1 || nsum + tsum < minn)) {
      minn = nsum + tsum;
      ap = i;
    }
  }
  memset(ans, 0, sizeof(ans));
  for (int i = 0; i <= ap; ++i) {
    ans[levels[i].idx] = 1;
    vans.push_back(make_pair(levels[i].b - levels[i].a, i));
  }
  for (int i = ap + 1; i < n; ++i) vans.push_back(make_pair(levels[i].a, i));
  sort(vans.begin(), vans.end());
  for (int i = 0; i < vans.size() && i < w - ap - 1; ++i)
    ans[levels[vans[i].second].idx]++;
  cout << minn << endl;
  for (int i = 0; i < n; ++i) printf("%d", ans[i]);
  puts("");
  return 0;
}
