#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <unordered_map>
#include <queue>
#define pb push_back
#define sz size()
using namespace std;
typedef vector<int> vi;
struct zadanie {
  int p, k, c;
};
int flow(vector<vi>& G) {
  const int end = G.sz-1;
  int f = 0;
  while(true) {
    vi parent(G.sz, -1);
    queue<int> kju;
    kju.push(0);
    parent[0] = 0;
    while(kju.sz && parent[end] == -1) {
      int a = kju.front(); kju.pop();
      for(int b=0; b<G[a].sz; ++b) {
	if(parent[b] == -1 && G[a][b] > 0) {
	  parent[b] = a;
	  kju.push(b);
	}
      }
    }
    if(parent[end] == -1) return f;
    int f1 = G[parent[end]][end];
    for(int a=end; parent[a] != a; a=parent[a])
      f1 = min(f1, G[parent[a]][a]);
    for(int a=end; parent[a] != a; a=parent[a]) {
      G[parent[a]][a] -= f1;
      G[a][parent[a]] += f1;
      // printf(". %d->%d\t%d\n", parent[a], a, G[parent[a]][a]);
      // printf(". %d->%d\t%d\n", a, parent[a], G[a][parent[a]]);
    }
    f += f1;
  }
}
int main() {
  int n, m; scanf("%d%d", &n, &m);
  vector<zadanie> zad(n+1);
  set<int> ts;
  int sumc = 0;
  for(int i=1; i<=n; ++i) {
    scanf("%d%d%d", &zad[i].p, &zad[i].k, &zad[i].c);
    ts.insert(zad[i].p);
    ts.insert(zad[i].k);
    sumc += zad[i].c;
  }
  vi konce(ts.begin(), ts.end());
  unordered_map<int,int> mk;
  for(int i=0; i<konce.sz; ++i) {
    mk[konce[i]] = i;
    //printf("%d -> %d\n", konce[i], i);
  }
  int b = konce.sz;
  vector<vi> G(1+n+b, vi(1+n+b, 0));
  for(int i=1; i<=n; ++i) {
    G[0][i] = zad[i].c;
    for(int j=mk[zad[i].p]; j+1<konce.sz && konce[j]<zad[i].k; ++j) {
      G[i][n+1+j] = konce[j+1] - konce[j];
    }
  }
  for(int j=0; j+1<konce.sz; ++j)
    G[n+1+j][n+b] = m*(konce[j+1] - konce[j]);
  //  for(int a=0; a<G.sz; ++a)
  //    for(int b=0; b<G[a].sz; ++b)
  //      if(G[a][b])
  //	printf("%d->%d:\t%d\n", a, b, G[a][b]);
  puts(flow(G) == sumc ? "TAK" : "NIE");
}
        | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <cstdio> #include <algorithm> #include <vector> #include <set> #include <unordered_map> #include <queue> #define pb push_back #define sz size() using namespace std; typedef vector<int> vi; struct zadanie { int p, k, c; }; int flow(vector<vi>& G) { const int end = G.sz-1; int f = 0; while(true) { vi parent(G.sz, -1); queue<int> kju; kju.push(0); parent[0] = 0; while(kju.sz && parent[end] == -1) { int a = kju.front(); kju.pop(); for(int b=0; b<G[a].sz; ++b) { if(parent[b] == -1 && G[a][b] > 0) { parent[b] = a; kju.push(b); } } } if(parent[end] == -1) return f; int f1 = G[parent[end]][end]; for(int a=end; parent[a] != a; a=parent[a]) f1 = min(f1, G[parent[a]][a]); for(int a=end; parent[a] != a; a=parent[a]) { G[parent[a]][a] -= f1; G[a][parent[a]] += f1; // printf(". %d->%d\t%d\n", parent[a], a, G[parent[a]][a]); // printf(". %d->%d\t%d\n", a, parent[a], G[a][parent[a]]); } f += f1; } } int main() { int n, m; scanf("%d%d", &n, &m); vector<zadanie> zad(n+1); set<int> ts; int sumc = 0; for(int i=1; i<=n; ++i) { scanf("%d%d%d", &zad[i].p, &zad[i].k, &zad[i].c); ts.insert(zad[i].p); ts.insert(zad[i].k); sumc += zad[i].c; } vi konce(ts.begin(), ts.end()); unordered_map<int,int> mk; for(int i=0; i<konce.sz; ++i) { mk[konce[i]] = i; //printf("%d -> %d\n", konce[i], i); } int b = konce.sz; vector<vi> G(1+n+b, vi(1+n+b, 0)); for(int i=1; i<=n; ++i) { G[0][i] = zad[i].c; for(int j=mk[zad[i].p]; j+1<konce.sz && konce[j]<zad[i].k; ++j) { G[i][n+1+j] = konce[j+1] - konce[j]; } } for(int j=0; j+1<konce.sz; ++j) G[n+1+j][n+b] = m*(konce[j+1] - konce[j]); // for(int a=0; a<G.sz; ++a) // for(int b=0; b<G[a].sz; ++b) // if(G[a][b]) // printf("%d->%d:\t%d\n", a, b, G[a][b]); puts(flow(G) == sumc ? "TAK" : "NIE"); } | 
 
            
         English
                    English