#include <bits/stdc++.h>
using namespace std;
template <class T>
void debug(T a, T b) {
  ;
}
template <class T>
void chmin(T& a, const T& b) {
  if (a > b) a = b;
}
template <class T>
void chmax(T& a, const T& b) {
  if (a < b) a = b;
}
namespace std {
template <class S, class T>
ostream& operator<<(ostream& out, const pair<S, T>& a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
}  // namespace std
int n, w;
pair<pair<int, int>, int> take[300005];
bool cmp(const pair<pair<int, int>, int>& a,
         const pair<pair<int, int>, int>& b) {
  return make_pair(a.first.second, a.first.first) <
         make_pair(b.first.second, b.first.first);
}
const int INF = 1e9 + 5;
set<pair<int, int> > pool, have;
char str[300005];
void solve(int& L, long long int& res, int flag = 0) {
  pool.clear();
  have.clear();
  for (int i = 0; i < (n); ++i)
    pool.insert(make_pair(take[i].first.first, take[i].second * 2));
  long long int cost = 0;
  for (int i = 0; i < (n + 1); ++i) {
    while (!have.empty() && have.size() + i > w) {
      auto it = have.end();
      --it;
      cost -= it->first;
      pool.insert(*it);
      have.erase(it);
    }
    while (have.size() + i < w && !pool.empty()) {
      cost += pool.begin()->first;
      have.insert(*pool.begin());
      pool.erase(pool.begin());
    }
    while (have.size() + i == w && !have.empty() && !pool.empty()) {
      auto it = have.end();
      --it;
      if (it->first > pool.begin()->first) {
        cost += pool.begin()->first - it->first;
        pool.insert(*it);
        have.erase(it);
        have.insert(*pool.begin());
        pool.erase(pool.begin());
      } else
        break;
    };
    ;
    if (flag && L == i) {
      for (int j = 0; j < (n); ++j) str[j] = '0';
      for (int j = 0; j < (i); ++j) str[take[j].second] = '1';
      ;
      ;
      for (auto it : have) {
        ;
        ;
        str[it.second / 2] = '1' + (it.second & 1);
      }
      str[n] = '\0';
      printf("%s\n", str);
      return;
    }
    if (have.size() + i == w && res > cost) {
      L = i;
      res = cost;
    }
    if (i == n) break;
    cost += take[i].first.first;
    pair<int, int> ers = make_pair(take[i].first.first, take[i].second * 2);
    if (pool.count(ers)) pool.erase(ers);
    if (have.count(ers)) {
      have.erase(ers);
      cost -= take[i].first.first;
    }
    pool.insert(make_pair(take[i].first.second - take[i].first.first,
                          take[i].second * 2 + 1));
    ;
    ;
    ;
    ;
  }
}
int main() {
  cin >> n >> w;
  for (int i = 0; i < (n); ++i) {
    scanf("%d%d", &take[i].first.first, &take[i].first.second);
    take[i].second = i;
  }
  sort(take, take + n, cmp);
  int L;
  long long int res = 1e18;
  solve(L, res);
  cout << res << endl;
  solve(L, res, 1);
  return 0;
}
