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
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct zad
{
	int id;
	int c;	
	int p;
};
zad pr;
vector<zad> v[1000005], u[1000005], ob;
int n, m, a, b, d, kk, pp=1000005;
bool czy, in[1000005];
queue<int> del;
bool cmp(zad x, zad y)
{
	if(x.p>y.p) return 1;
	else if(x.p==y.p)
	{
		if(x.c<y.c) return 1;
		else return 0;
	}
	else return 0;
}
int main()
{
    scanf("%d", &n);
    scanf("%d", &m);
    for(int i=1;i<=n;i++)
    {
    	scanf("%d%d%d", &a,&b,&d);
    	pr.id=i;
    	pr.c=d;
    	pr.p=a;
    	v[b].push_back(pr);
    	u[a].push_back(pr);
    	kk=max(kk,b);
    	pp=min(pp,a);
	}
	for(int i=pp;i<=kk;i++) sort(v[i].begin(),v[i].end(),cmp);
	for(int j=kk;j>=pp;j--)
	{
		for(int i=0;i<v[j].size();i++) ob.push_back(v[j][i]);
		for(int i=0;i<u[j].size();i++) if(!in[u[j][i].id])
		{
			czy=1;
			goto koniec;	
		}
		int y=ob.size();
		for(int i=y-1;i>=0 && i>=y-m;i--)
		{
			ob[i].c-=1;
			if(ob[i].c==0)
			{
			  	in[ob[i].id]=1;
			  	del.push(i);
			}
		}
		int x=0;
		while(!del.empty())
		{
		  	ob.erase(ob.begin()+del.front());
		  	del.pop();
		}
	}
	koniec:
	if(czy) printf("NIE");
	else printf("TAK");
    return 0;
}