Problem p02695 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define F first
#define S second
int N, M, Q;
int q[55][5];
int a[15];
ll int fn(int p, int val) {
  if (val <= 0)
    return 0;
  if (p < 0)
    return 0;
  int x, y, i, b, c, d, mn;
  x = 0;
  y = 0;
  if (val > 1)
    x = fn(p, val - 1);
  if (p > 0)
    y = fn(p - 1, val);
  a[p] = val;
  int flag = 1;
  for (i = 0; i < N - 1; i++) {
    if (a[i] > a[i + 1]) {
      flag = 0;
      break;
    }
  }
  if (flag == 1) {
    ll int sum = 0;
    for (i = 0; i < Q; i++) {
      mn = q[i][0];
      b = q[i][1];
      c = q[i][2];
      d = q[i][3];
      mn -= 1;
      b -= 1;
      if ((a[b] - a[mn]) == c) {
        sum += d;
      }
    }
    return (x >= y ? x : y) >=
                   (sum >= fn(p - 1, val - 1) ? sum : fn(p - 1, val - 1))
               ? (x >= y ? x : y)
               : (sum >= fn(p - 1, val - 1) ? sum : fn(p - 1, val - 1));
  } else {
    return (x >= y ? x : y) >= (fn(p - 1, val - 1)) ? (x >= y ? x : y)
                                                    : (fn(p - 1, val - 1));
  }
}
int main() {
  int i, j;
  cin >> N >> M >> Q;
  for (i = 0; i < Q; i++) {
    for (j = 0; j < 4; j++)
      cin >> q[i][j];
  }
  for (i = 0; i < N; i++)
    a[i] = M;
  cout << fn(N - 1, M) << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define F first
#define S second
ll int q[55][10];
ll int N, M;
ll int fun(vector<ll int> x, ll int i) {
  // cout<<M<<endl;
  // cout<<i<<endl;
  ll int a, b, c, d, j, z;
  a = q[i][0];
  b = q[i][1];
  c = q[i][2];
  d = q[i][3];
  a -= 1;
  b -= 1;
  if (i == 0) {
    ll int mx, mn, mn1, mx1;
    if (x[b] == -1 && x[a] == -1) {
      mx = M;
      mn = 1;
      mx1 = 1;
      mn1 = M;
      ll int maxi = 0;
      for (j = b + 1; j < N; j++) {
        if (x[j] != -1) {
          mx = x[j];
          break;
        }
      }
      for (j = a - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mn = x[j];
          break;
        }
      }
      for (j = b - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mx1 = x[j];
          break;
        }
      }
      for (j = a + 1; j < N; j++) {
        if (x[j] != -1) {
          mn1 = x[j];
          break;
        }
      }
      for (j = mx; j >= mn; j--) {
        if (j >= mx1 && (j - c) >= mn && (j - c) <= mn1) {
          x[b] = j;
          x[a] = j - c;
          maxi = d;
        }
      }
      return maxi;
    } else if (x[b] != -1 && x[a] == -1) {
      mn = 1;
      mn1 = M;
      for (j = a - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mn = x[j];
          break;
        }
      }
      for (j = a + 1; j < N; j++) {
        if (x[j] != -1) {
          mn1 = x[j];
          break;
        }
      }
      if ((x[b] - c) >= mn && (x[b] - c) <= mn1)
        return d;
      else
        return 0;
    } else if (x[b] == -1 && x[a] != -1) {
      mx = M;
      mx1 = 1;
      for (j = b + 1; j < N; j++) {
        if (x[j] != -1) {
          mx = x[j];
          break;
        }
      }
      for (j = b - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mx1 = x[j];
          break;
        }
      }
      if ((x[a] + c) <= mx && (x[a] + c) >= mx1)
        return d;
      else
        return 0;
    } else {
      if ((x[b] - x[a]) == c)
        return d;
      else
        return 0;
    }
  } else {
    ll int mx, mn, mn1, mx1;
    ll int p = fun(x, i - 1);
    // cout<<i<<endl;
    // for(auto l=0;l<N;l++)
    // cout<<x[l]<<" ";
    // cout<<endl;
    if ((x[b] == -1) && (x[a] == -1)) {
      // cout<<" hm yha aayye inke liye "<<i<<endl;
      ll int maxi;
      mx = M;
      mn = 1;
      mn1 = M;
      mx1 = 1;
      maxi = 0;
      for (j = b + 1; j < N; j++) {
        if (x[j] != -1) {
          mx = x[j];
          break;
        }
      }
      for (j = a - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mn = x[j];
          break;
        }
      }
      for (j = a + 1; j < N; j++) {
        if (x[j] != -1) {
          mn1 = x[j];
          break;
        }
      }
      for (j = b - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mx1 = x[j];
          break;
        }
      }
      for (j = mx; j >= mn; j--) {
        if (j >= mx1 && (j - c) >= mn && (j - c) <= mn1) {
          x[b] = j;
          x[a] = j - c;
          z = d + fun(x, i - 1);
          maxi = maxi >= z ? maxi : z;
        }
      }
      return maxi >= p ? maxi : p;
    } else if (x[b] != -1 && x[a] == -1) {
      mn = 1;
      mn1 = M;
      for (j = a - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mn = x[j];
          break;
        }
      }
      for (j = a + 1; j < N; j++) {
        if (x[j] != -1) {
          mn1 = x[j];
          break;
        }
      }
      if ((x[b] - c) >= mn && (x[b] - c) <= mn1) {
        x[a] = x[b] - c;
        ll int t = fun(x, i - 1);
        return (d + t) >= p ? (d + t) : p;
      } else {
        return p;
      }
    } else if (x[b] == -1 && x[a] != -1) {
      mx = M;
      mx1 = 1;
      for (j = b + 1; j < N; j++) {
        if (x[j] != -1) {
          mx = x[j];
          break;
        }
      }
      for (j = b - 1; j >= 0; j--) {
        if (x[j] != -1) {
          mx1 = x[j];
          break;
        }
      }
      if ((x[a] + c) <= mx && (x[a] + c) >= mx1) {
        x[b] = x[a] + c;
        ll int t = fun(x, i - 1);
        return (d + t) >= p ? (d + t) : p;
      } else
        return p;
    } else {
      if ((x[b] - x[a]) == c)
        return d + p;
      else
        return p;
    }
  }
}
int main() {
  ll int x[15], i, j, Q;
  vector<ll int> v;
  cin >> N >> M >> Q;
  for (i = 0; i < Q; i++) {
    for (j = 0; j < 4; j++) {
      cin >> q[i][j];
    }
  }

  for (i = 0; i < 15; i++) {
    v.pb(-1);
  }
  cout << fun(v, Q - 1);
  return 0;
}