Problem p00190 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <map>
#include <queue>
#include <stdio.h>
typedef long long L;
typedef std::map<L, int> M;
M m;
L S(L l, int a, int b) {
  L c = (l >> (a * 4)) & 15;
  l &= ~(15LL << (a * 4));
  L d = (l >> (b * 4)) & 15;
  l &= ~(15LL << (b * 4));
  return l | (c << (b * 4)) | (d << (a * 4));
}

struct I {
  int operator()(L l, int x) {
    if (m.find(l) != m.end())
      return -2;
    m[l] = x;
    return -1;
  }
};
struct E {
  M inm;
  int operator()(L l, int x) {
    M::iterator ite = m.find(l);
    if (ite != m.end())
      return ite->second + x;
    else if (inm.find(l) != inm.end())
      return -2;
    inm[l] = x;
    return -1;
  }
};
template <class T> int F(L init, T func) {
  const int di[13][4] = {{3}, {3, 6},        {1, 2, 4, 7},    {3, 8},
                         {6}, {2, 5, 7, 10}, {3, 6, 8, 11},   {4, 7, 9, 12},
                         {8}, {6, 11},       {7, 10, 12, 13}, {8, 11},
                         {11}};
  M::iterator ite;
  std::queue<L> q;
  q.push(init);
  q.push(-1);
  int i, j, k;
  for (int x = 0; x <= 10;) {
    L l = q.front();
    q.pop();
    if (l < 0) {
      q.push(l);
      ++x;
      continue;
    }
    int res = func(l, x);
    if (res == -2)
      continue;
    if (res >= 0)
      return res;
    int a[2];
    for (i = j = 0; i < 13; ++i)
      if (!(l & (15LL << (i * 4))))
        a[j++] = i;
    for (k = 0; k < 2; ++k)
      for (i = 0; i < 4; ++i) {
        int c = di[a[k]][i];
        if (c) {
          L t = S(l, a[k], c - 1);
          q.push(t);
        } else
          break;
      }
  }
  return -1;
}
int main() {
  F(0xBA9876543210LL, I());
  for (;;) {
    L l = 0, x;
    for (int i = 0; i < 13; ++i) {
      if (scanf("%lld", &x), x < 0)
        return 0;
      l |= (x << (i * 4));
    }
    x = F(l, E());
    x < 0 ? puts("NA") : printf("%lld\\n", x);
  }
}

Error: MLE

Fixed submission:

#include <map>
#include <queue>
#include <stdio.h>
typedef long long L;
L S(L l, int a, int b) {
  L c = (l >> (a * 4)) & 15;
  l &= ~(15LL << (a * 4));
  L d = (l >> (b * 4)) & 15;
  l &= ~(15LL << (b * 4));
  return l | (c << (b * 4)) | (d << (a * 4));
}
int main() {
  const int di[13][4] = {{3}, {3, 6},        {1, 2, 4, 7},    {3, 8},
                         {6}, {2, 5, 7, 10}, {3, 6, 8, 11},   {4, 7, 9, 12},
                         {8}, {6, 11},       {7, 10, 12, 13}, {8, 11},
                         {11}};
  typedef std::map<L, int> M;
  M m;
  M::iterator ite;
  std::queue<L> q;
  q.push(0xBA9876543210LL);
  q.push(-1);
  int i, j, k;
  for (int x = 0; x <= 20;) {
    L l = q.front();
    q.pop();
    if (l < 0) {
      q.push(l);
      ++x;
      continue;
    }
    ite = m.find(l);
    if (ite != m.end())
      continue;
    m[l] = x;
    int a[2];
    for (i = j = 0; i < 13; ++i)
      if (!(l & (15LL << (i * 4))))
        a[j++] = i;
    for (k = 0; k < 2; ++k)
      for (i = 0; i < 4; ++i) {
        int c = di[a[k]][i];
        if (c) {
          L t = S(l, a[k], c - 1);
          q.push(t);
        } else
          break;
      }
  }
  for (;;) {
    L l = 0, x;
    for (i = 0; i < 13; ++i) {
      if (scanf("%lld", &x), x < 0)
        return 0;
      l |= (x << (i * 4));
    }
    ite = m.find(l);
    ite == m.end() ? puts("NA") : printf("%d\\n", ite->second);
  }
}