#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c;
  int positive = 1;
  while (!isdigit(c = getchar()))
    if (c == '-') positive = 0;
  do x = x * 10 + c - '0';
  while (isdigit(c = getchar()));
  if (!positive) x = -x;
}
template <typename T>
inline void write(T x) {
  if (x > 9) write(x / 10);
  putchar(x % 10 + 48);
}
const int maxn = 300010;
set<pair<int, int> > s1, s2;
int n, w;
int a[maxn * 2];
int opt[maxn];
int used[maxn * 2];
long long ans;
void input() {
  read(n);
  read(w);
  for (int i = (1), _b = (n); i <= _b; i++) {
    int x, y;
    read(x);
    read(y);
    a[i] = x;
    a[i + n] = y - x;
    s1.insert(pair<int, int>(x, i));
    s2.insert(pair<int, int>(y, i));
  }
}
void init() {}
void solve() {
  while (w--) {
    while (used[s1.begin()->second]) s1.erase(s1.begin());
    while (used[s2.begin()->second]) s2.erase(s2.begin());
    pair<int, int> now = *s1.begin();
    s1.erase(s1.begin());
    while (used[s1.begin()->second]) s1.erase(s1.begin());
    int touse;
    if (!w || s2.empty() || s2.begin()->first >= s1.begin()->first + now.first)
      touse = now.second;
    else {
      touse = s2.begin()->second;
      s1.insert(now);
      s2.erase(s2.begin());
    }
    ans += a[touse];
    if (touse > n)
      opt[touse - n] = 2;
    else
      opt[touse] = 1;
    used[touse] = 1;
    if (touse <= n) s1.insert(pair<int, int>(a[touse + n], touse + n));
  }
}
void output() {
  write(ans);
  putchar('\n');
  for (int i = (1), _b = (n); i <= _b; i++) write(opt[i]);
}
int main() {
  clock_t timestart, timeend;
  timestart = clock();
  input();
  init();
  solve();
  output();
  timeend = clock();
  return 0;
}
