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
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct zad
{
	int p;
	int k;
	int c;
	int r;
};

struct po_r
{
    inline bool operator() (const zad& struct1, const zad& struct2)
    {
        return (struct1.r < struct2.r);
    }
};


int main()
{
	int n,m,poczatek, koniec,a;
	vector<zad> tab;
	cin>>n>>m;
	int* wynik = new int[1000001];
	for (int i = 0; i < n; i++)
	{
		zad z;
		cin>>z.p>>z.k>>z.c;
		z.r = z.k - z.p - z.c;
		tab.push_back(z);
	}
	int flaga = 1;

	sort(tab.begin(), tab.end(), po_r());

	for (a = 0; a<1000001; a++)
		wynik[a] = 0;

	a = 0;
	while (a < tab.size() && flaga)
	{
		while (tab[a].c > 0 && flaga)
		{
			poczatek = tab[a].p;
			koniec = tab[a].k;
			int min = 1000001;
			int indeks = 1000001;
			while (poczatek < koniec)
			{
				if (wynik[poczatek] < m && wynik[poczatek] < min)
				{
					indeks = poczatek;
					min = wynik[poczatek];
				}
				poczatek++;
			}
			if (indeks == 1000001)
				flaga = 0;
			else
			{
				wynik[indeks]++;
				tab[a].c--;
			}
		}
		a++;
	}

	if (flaga)
		cout<<"TAK\n";
	else
		cout<<"NIE\n";

	return 0;
}