This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int n,k,dif0;
multiset<pair<int,int>> g[60005];
bool viz[60005];
int vll;
void dfs(int nod,int parval)
{
    //cout << nod << ' ' << vll << endl;
    viz[nod] = true;
    for (auto it : g[nod])
    {
        if (!viz[it.first])
        {
            if (nod <= n)
                vll += it.second;
            else
                vll -= it.second;
            dfs(it.first,it.second);
            return;
        }
    }
    for (auto it : g[nod])
    {
        if (nod <= n)
            vll += it.second;
        else
            vll -= it.second;
    }
    if (nod <= n)
        vll -= parval;
    else
        vll += parval;
}
bitset<1200005> dp;///shiftat cu 600000
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> k;
    for (int i = 1; i <= 2 * n; i++)
    {
        int x,y,z;
        cin >> x >> y >> z;
        g[x].insert({y + n,z});
        g[y + n].insert({x,z});
    }
    set<pair<int,int>> degmin;
    for (int i = 1; i <= 2 * n; i++)
    {
        degmin.insert({g[i].size(),i});
    }
    while (!degmin.empty() and (*degmin.begin()).first < 2)
    {
        pair<int,int> pr = *degmin.begin();
        degmin.erase(degmin.begin());
        if (pr.first == 0)
        {
            cout << "NO";
            return 0;
        }
        int nod = pr.second;
        int vecin = (*g[nod].begin()).first;
        int cost = (*g[nod].begin()).second;
        if (nod <= n)
            dif0 += cost;
        else
            dif0 -= cost;
        g[nod].clear();
        g[vecin].erase(g[vecin].find({nod,cost}));
        int dgg = (int)g[vecin].size() + 1;
        degmin.erase({dgg,vecin});
        degmin.insert({dgg - 1,vecin});
    }
    vector<int> noduri;
    for (auto it : degmin)
        noduri.push_back(it.second);
    vector<int> vals;
    for (auto it : noduri)
    {
        if (!viz[it])
        {
            vll = 0;
            dfs(it,0);
            vals.push_back(abs(vll));
            //cout << abs(vll) << endl;
        }
    }
    dp[dif0 + 600000] = 1;
    //cout << dif0 << endl;
    for (auto it : vals)
    {
        dp = (dp << it) | (dp >> it);
    }
    for (int i = 600000 - k; i <= 600000 + k; i++)
    {
        if (dp[i])
        {
            cout << "YES";
            return 0;
        }
    }
    cout << "NO";
    return 0;
}
/**
Fac un graf bipartit cu muchie L[i] -- R[j] pentru un om cu i sau j
deg(i) = 0 => NO
deg(i) = 1 => fac muchia aia sa fie asa si o elimin din graf, impreuna cu nodul evident
daca orice deg(i) >= 2, sum(deg(i)) >= 4N dar sum(deg(i)) == 4N deci deg(i) = 2 pentru fiecare i
graful poate fi impartit in cicluri, la fiecare ciclu am doua variante
Fie D = diferenta care s-a creat pana sa ajung la graful asta din cicluri
Raspunsul pentru s[i] = 1 este clar YES, acum sa vad cand am si k si s-uri diferite
Fiecare ciclu poate sa imi genereze doua valori, a[i] si b[i] sa zicem (fie m numarul de cicluri)
dp[i][j] = pot sa fac din primele i cicluri valoarea j (M * N * 20 de stari)
M e O(N) worst case (gen, N / 2) deci tot pot avea N^2 * 10 stari
Average bitset W lol, gen acum am aprox N^2 / 6 sau cv care ar trebui sa intre oricum
**/
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |