Problem p03165 (C++)

Buggy submission (status: Runtime Error):
#define ll long long int
#include <bits/stdc++.h>
// #include <fstream>
using namespace std;

#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define pf push_front
#define vi vector<ll>
#define pii pair<ll, ll>
#define qi queue<ll>
#define mem(a, b) memset(a, b, sizeof(a))
#define print(a) cout << a << '\n'
#define sorted(arr) sort(arr.begin(), arr.end())
#define gcd(a, b) gcd((a), (b))
#define lcm(a, b) ((a) * (b)) / gcd((a), (b))
#define all(v) v.begin(), v.end()
#define read(a) scanf("%d", &a)
#define f(a, n) for (ll i = a; i < n; i++)
#define in2(n, m, arr)                                                         \
  for (ll i = 0; i < n; i++) {                                                 \
    for (ll j = 0; j < m; j++)                                                 \
      cin >> arr[i][j];                                                        \
  }
#define debug(a) cerr << a << " ";
#define debug1(a) cerr << a << '\n'

/*typedef tree<int, null_type, less<int>, rb_tree_tag ,
 * tree_order_statistics_node_update> Set;*/

const unsigned ll mod = 1e9 + 7;
const ll inf = (ll)1e18 + 2;
const ll N = (ll)1e6 + 2;
//
// template<typename... T>
// void write(T&... args)
//{
//    ((cout << args << ' '), ...);
//}
// ll power ( ll x , ll y)
//{
//    ll res = 1;
//    while (y > 0)
//    {
//        if (y & 1)
//            res = (res * x) ;
//        y = y >> 1;
//        x = (x * x) ;
//    }
//    return res  ;
//}
//
// struct node{
//    ll x , y , z;
//};
// map<pair<ll, ll>,ll> c;
// vector<set<ll>> tree;
// vector<ll> ar ;
// set<ll> s;
// ll get(ll x)
//{
//    if(x == ar[x])
//        return x;
//    return ar[x] = get(ar[x]);
//}
// void merge(ll a ,ll b)
//{
//    a = get(a);
//    b = get(b);
//    if(a == b)
//    {
//        return ;
//    }
//    ar[b] = ar[a];
// }
//
// ll sev[100006];
// vector<ll> pri;
// void seive()
//{
//    for(ll i = 2 ; i < 100006 ; i ++)
//    {
//        if(!sev[i])
//        {
//            for(ll j = i ; j < 100006 ; j += i)
//            {
//                if(!sev[j])
//                    sev[j] = i;
//            }
//        }
//        if(sev[i] == i)
//            pri.pb(i);
//    }
//}

void solve() {
  string s1, s2;
  cin >> s1 >> s2;
  ll n = s1.size(), m = s2.size();
  ll arr[n + 1][m + 1];
  mem(arr, 0);
  ll mx = 0;
  for (ll i = 1; i <= n; i++) {
    for (ll j = 1; j <= m; j++) {
      if (s1[i - 1] == s2[j - 1]) {
        arr[i][j] = arr[i - 1][j - 1] + 1;
      }
      arr[i][j] = max({arr[i][j], arr[i - 1][j], arr[i][j - 1]});
      mx = max(mx, arr[i][j]);
      // cout << arr[i][j] << ' ';
    }
    // cout << '\n';
  }
  ll l = n, r = m;
  // cout << mx << '\n';
  string ans = "";
  while (l > 0 && r > 0) {
    while (arr[l][r] == mx)
      r--;
    r++;
    ans += s2[r - 1];
    l--, r--, mx--;
  }
  reverse(all(ans));
  print(ans);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ll t;
  t = 1;
  // cin >> t;
  // seive();
  while (t--) {
    solve();
  }
  cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
  return 0;
}


Fixed submission:
#define ll long long int
#include <bits/stdc++.h>
// #include <fstream>
using namespace std;

#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define pf push_front
#define vi vector<ll>
#define pii pair<ll, ll>
#define qi queue<ll>
#define mem(a, b) memset(a, b, sizeof(a))
#define print(a) cout << a << '\n'
#define sorted(arr) sort(arr.begin(), arr.end())
#define gcd(a, b) gcd((a), (b))
#define lcm(a, b) ((a) * (b)) / gcd((a), (b))
#define all(v) v.begin(), v.end()
#define read(a) scanf("%d", &a)
#define f(a, n) for (ll i = a; i < n; i++)
#define in2(n, m, arr)                                                         \
  for (ll i = 0; i < n; i++) {                                                 \
    for (ll j = 0; j < m; j++)                                                 \
      cin >> arr[i][j];                                                        \
  }
#define debug(a) cerr << a << " ";
#define debug1(a) cerr << a << '\n'

/*typedef tree<int, null_type, less<int>, rb_tree_tag ,
 * tree_order_statistics_node_update> Set;*/

const unsigned ll mod = 1e9 + 7;
const ll inf = (ll)1e18 + 2;
const ll N = (ll)1e6 + 2;
//
// template<typename... T>
// void write(T&... args)
//{
//    ((cout << args << ' '), ...);
//}
// ll power ( ll x , ll y)
//{
//    ll res = 1;
//    while (y > 0)
//    {
//        if (y & 1)
//            res = (res * x) ;
//        y = y >> 1;
//        x = (x * x) ;
//    }
//    return res  ;
//}
//
// struct node{
//    ll x , y , z;
//};
// map<pair<ll, ll>,ll> c;
// vector<set<ll>> tree;
// vector<ll> ar ;
// set<ll> s;
// ll get(ll x)
//{
//    if(x == ar[x])
//        return x;
//    return ar[x] = get(ar[x]);
//}
// void merge(ll a ,ll b)
//{
//    a = get(a);
//    b = get(b);
//    if(a == b)
//    {
//        return ;
//    }
//    ar[b] = ar[a];
// }
//
// ll sev[100006];
// vector<ll> pri;
// void seive()
//{
//    for(ll i = 2 ; i < 100006 ; i ++)
//    {
//        if(!sev[i])
//        {
//            for(ll j = i ; j < 100006 ; j += i)
//            {
//                if(!sev[j])
//                    sev[j] = i;
//            }
//        }
//        if(sev[i] == i)
//            pri.pb(i);
//    }
//}

void solve() {
  string s1, s2;
  cin >> s1 >> s2;
  ll n = s1.size(), m = s2.size();
  ll arr[n + 1][m + 1];
  mem(arr, 0);
  ll mx = 0;
  for (ll i = 1; i <= n; i++) {
    for (ll j = 1; j <= m; j++) {
      if (s1[i - 1] == s2[j - 1]) {
        arr[i][j] = arr[i - 1][j - 1] + 1;
      }
      arr[i][j] = max({arr[i][j], arr[i - 1][j], arr[i][j - 1]});
      mx = max(mx, arr[i][j]);
      // cout << arr[i][j] << ' ';
    }
    // cout << '\n';
  }
  ll l = n, r = m;
  // cout << mx << '\n';
  string ans = "";
  while (l > 0 && r > 0 && mx > 0) {
    while (arr[l][r] == mx)
      l--;
    l++;
    while (arr[l][r] == mx)
      r--;
    r++;
    ans += s2[r - 1];
    l--, r--, mx--;
  }
  reverse(all(ans));
  print(ans);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ll t;
  t = 1;
  // cin >> t;
  // seive();
  while (t--) {
    solve();
  }
  cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
  return 0;
}