Problem:
Score : 300 points

Problem Statement

Given are positive integers N, M, Q, and Q quadruples of integers ( a_i , b_i , c_i , d_i ).

Consider a sequence A satisfying the following conditions:

A is a sequence of N positive integers.

1 \leq A_1 \leq A_2 \le \cdots \leq A_N \leq M.

Let us define a score of this sequence as follows:

The score is the sum of d_i over all indices i such that A_{b_i} - A_{a_i} = c_i. (If there is no such i, the score is 0.)

Find the maximum possible score of A.

Constraints

All values in input are integers.

2 ≤ N ≤ 10

1 \leq M \leq 10

1 \leq Q \leq 50

1 \leq a_i < b_i \leq N ( i = 1, 2, ..., Q )

0 \leq c_i \leq M - 1 ( i = 1, 2, ..., Q )

(a_i, b_i, c_i) \neq (a_j, b_j, c_j) (where i \neq j)

1 \leq d_i \leq 10^5 ( i = 1, 2, ..., Q )

Input

Input is given from Standard Input in the following format:

N M Q
a_1 b_1 c_1 d_1
:
a_Q b_Q c_Q d_Q

Output

Print the maximum possible score of A.

Sample Input 1

3 4 3
1 3 3 100
1 2 2 10
2 3 2 10

Sample Output 1

110

When A = \{1, 3, 4\}, its score is 110. Under these conditions, no sequence has a score greater than 110, so the answer is 110.

Sample Input 2

4 6 10
2 4 1 86568
1 4 0 90629
2 3 0 90310
3 4 1 29211
3 4 3 78537
3 4 2 8580
1 2 1 96263
1 4 2 2156
1 2 0 94325
1 4 3 94328

Sample Output 2

357500

Sample Input 3

10 10 1
1 10 9 1

Sample Output 3

1

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
#define int long long

template <class T>
bool INRANGE(T x, T a, T b) { return a <= x && x <= b; }
template <class T>
inline bool chmin(T &a, T b)
{
    if (a > b)
    {
        a = b;
        return true;
    }
    return false;
}
template <class T>
inline bool chmax(T &a, T b)
{
    if (a < b)
    {
        a = b;
        return true;
    }
    return false;
}

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define RREP(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define RFOR(i, a, b) for (int i = (a); i >= (b); --i)
#define ALL(v) (v).begin(), (v).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" \
                      << " " << __FILE__ << endl;

typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

struct ip
{
   int a, b, c, d;
   ip() {};
   ip(int a, int b, int c, int d)  {
       this->a = a;
       this->b = b;
       this->c = c;
       this->d = d;
   }
};


signed main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    int N, M, Q;
    cin >> N >> M >> Q;

    vector<ip> vp(Q);
    REP(i, Q) {
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        ip e = ip{a, b, c, d};
        vp[i] =  e;
    }

    // for (ip p : vp) {
    //     cout << p.a << ", " << p.b << ", " << p.c << ", " << p.d << endl; 
    // }

    if (Q == 1) {
        ip p = vp[0];
        vi a(N, -1);
        a[p.a] = 1;
        a[p.b] = p.c+a[p.a];

        if (a[p.b] > M) {
            cout << 0 << endl;
        } else {
            cout << p.d << endl;
        }
        return 0;
    }

    int ans = 0;
    REP(i, Q) {
        int tmp = 0;
        vi a(N, -1);
        ip p = vp[i];
        a[p.a] = 1;
        a[p.b] = p.c+a[p.a];
        if (a[p.b] > M) continue;
        tmp += p.d;
        REP(j, Q) {
            if (i == j) continue;
            ip p2 = vp[j];
            if (a[p2.a] == -1) {
                int min_num = a[0];
                REP(it, p2.a) if (a[it] != -1) min_num = max(min_num, a[it]);
                if (min_num > M) continue;
                a[p2.a] = min_num;
            }
            if (a[p2.b] == -1) {
                int ta = p2.c+a[p2.a];
                if (ta > M) continue;
                if (p2.b != 0) if (a[p2.b-1] >ta) continue;
                a[p2.b] = min(ta, M);
            }

            if (a[p2.b] - a[p2.a] == p2.c) tmp += p2.d;
        }

        ans = max(ans, tmp);
    }

    cout << ans << endl;

    return 0;
}