Problem p02839 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#pragma GCC target("sse,sse2,sse3,sse4.1,sse4.2,popcnt,abm,mmx,avx")
#pragma comment(linker, "/STACK:102400000,102400000")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
inline int read() {
  int ret = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-')
      w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    ret = ret * 10 + ch - '0', ch = getchar();
  return w * ret;
}
int h, w;
bitset<25610> s[85][85];
int a[85][85];
int b[85][85];
int main() {
  cin >> h >> w;
  for (register int i = 1; i <= h; i++)
    for (register int j = 1; j <= w; j++)
      a[i][j] = read();
  for (register int i = 1; i <= h; i++)
    for (register int j = 1; j <= w; j++)
      b[i][j] = read();
  s[0][1][12800] = 1;
  for (register int i = 1; i <= h; i++)
    for (register int j = 1; j <= w; j++) {
      int x = abs(a[i][j] - b[i][j]);
      for (register int k = -12800; k <= 12800; k++) {
        if (k - x >= -12800)
          s[i][j][k + 12800] = s[i][j][k + 12800] | s[i - 1][j][k - x + 12800],
                      s[i][j][k + 12800] =
                          s[i][j][k + 12800] | s[i][j - 1][k - x + 12800];
        if (k + x <= 12800)
          s[i][j][k + 12800] = s[i][j][k + 12800] | s[i - 1][j][k + x + 12800],
                      s[i][j][k + 12800] =
                          s[i][j][k + 12800] | s[i][j - 1][k + x + 12800];
      }
    }
  for (register int i = 0; i <= 12800; i++)
    if (s[h][w][12800 + i] || s[h][w][12800 - i]) {
      cout << i << endl;
      return 0;
    }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int ret = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-')
      w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    ret = ret * 10 + ch - '0', ch = getchar();
  return w * ret;
}
int h, w;
bitset<25610> s[85][85];
int a[85][85];
int b[85][85];
int main() {
  cin >> h >> w;
  for (register int i = 1; i <= h; i++)
    for (register int j = 1; j <= w; j++)
      a[i][j] = read();
  for (register int i = 1; i <= h; i++)
    for (register int j = 1; j <= w; j++)
      b[i][j] = read();
  s[0][1][12800] = 1;
  for (register int i = 1; i <= h; i++)
    for (register int j = 1; j <= w; j++) {
      int x = abs(a[i][j] - b[i][j]);
      for (register int k = -12800; k <= 12800; k++) {
        if (k - x >= -12800)
          s[i][j][k + 12800] = s[i][j][k + 12800] | s[i - 1][j][k - x + 12800],
                      s[i][j][k + 12800] =
                          s[i][j][k + 12800] | s[i][j - 1][k - x + 12800];
        if (k + x <= 12800)
          s[i][j][k + 12800] = s[i][j][k + 12800] | s[i - 1][j][k + x + 12800],
                      s[i][j][k + 12800] =
                          s[i][j][k + 12800] | s[i][j - 1][k + x + 12800];
      }
    }
  for (register int i = 0; i <= 12800; i++)
    if (s[h][w][12800 + i] || s[h][w][12800 - i]) {
      cout << i << endl;
      return 0;
    }
  return 0;
}