// Solution to 5SZE
// Author: Michal Czuczman <michal.czuczman@gmail.com>
// created on Sat Nov 26 05:18:34 CET 2016
#include <algorithm>
#include <assert.h>
#include <climits>
#include <iostream>
#include <vector>
using namespace std;
typedef unsigned int uint;
typedef unsigned long long ull;
struct Task {
	int begin, end, size;
	Task() {}
	Task(int begin_, int end_, int size_)
		: begin(begin_), end(end_), size(size_) {}
	int margin() const { return end - begin - size; }
	void done(int from, int to) {
		if(from < begin) {
			from = begin;
		}
		if(to > end) {
			to = end;
		}
		if(from < to) {
			size -= to - from;
			assert(size >= 0);
			if(size == 0) {
				begin = INT_MAX;
				end = INT_MAX;
			} else {
				begin = to;
			}
		}
	}
	bool is_valid() const {
		return size <= end - begin;
	}
};
istream& operator>>(istream& is, Task& t) {
	return cin >> t.begin >> t.end >> t.size;
}
bool operator<(const Task& t1, const Task& t2) {
	if(t1.begin < t2.begin) {
		return true;
	} else if(t1.begin == t2.begin) {
		return t1.end < t2.end;
	} else {
		return false;
	}
}
int main() {
	ios::sync_with_stdio(false);
	/*
	assert(Task(0, 2, 2) < Task(0, 3, 1));
	assert(Task(0, 2, 1) < Task(0, 3, 2));
	assert(Task(0, 4, 2) < Task(1, 3, 2));
	assert(Task(0, 3, 1) < Task(0, 4, 3));
	*/
	int num_tasks, num_cpu;
	cin >> num_tasks >> num_cpu;
	vector<Task> tasks;
	tasks.reserve(num_tasks);
	for(int i = 0; i < num_tasks; ++i) {
		Task t;
		cin >> t;
		tasks.push_back(t);
	}
	while(1) {
		sort(&tasks[0], &tasks[num_tasks]);
		while(num_tasks > 0 && tasks[num_tasks - 1].size == 0) {
			--num_tasks;
		}
		if(num_tasks == 0) {
			break;
		}
		int now = tasks[0].begin;
		int next = now + tasks[0].size;
		for(int i = 1; i < num_tasks; ++i) {
			int b = tasks[i].begin;
			if(b > now && b < next) {
				next = b;
			}
			int c = b + tasks[i].size;
			if(c < next) {
				next = c;
			}
		}
		for(int i = 0; i < num_tasks; ++i) {
			if(i < num_cpu) {
				tasks[i].done(now, next);
			} else {
				tasks[i].begin = next;
			}
			if(!tasks[i].is_valid()) {
				cout << "NIE\n";
				return 0;
			}
		}
	}
	cout << "TAK\n";
	return 0;
}
        | 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | // Solution to 5SZE // Author: Michal Czuczman <michal.czuczman@gmail.com> // created on Sat Nov 26 05:18:34 CET 2016 #include <algorithm> #include <assert.h> #include <climits> #include <iostream> #include <vector> using namespace std; typedef unsigned int uint; typedef unsigned long long ull; struct Task { int begin, end, size; Task() {} Task(int begin_, int end_, int size_) : begin(begin_), end(end_), size(size_) {} int margin() const { return end - begin - size; } void done(int from, int to) { if(from < begin) { from = begin; } if(to > end) { to = end; } if(from < to) { size -= to - from; assert(size >= 0); if(size == 0) { begin = INT_MAX; end = INT_MAX; } else { begin = to; } } } bool is_valid() const { return size <= end - begin; } }; istream& operator>>(istream& is, Task& t) { return cin >> t.begin >> t.end >> t.size; } bool operator<(const Task& t1, const Task& t2) { if(t1.begin < t2.begin) { return true; } else if(t1.begin == t2.begin) { return t1.end < t2.end; } else { return false; } } int main() { ios::sync_with_stdio(false); /* assert(Task(0, 2, 2) < Task(0, 3, 1)); assert(Task(0, 2, 1) < Task(0, 3, 2)); assert(Task(0, 4, 2) < Task(1, 3, 2)); assert(Task(0, 3, 1) < Task(0, 4, 3)); */ int num_tasks, num_cpu; cin >> num_tasks >> num_cpu; vector<Task> tasks; tasks.reserve(num_tasks); for(int i = 0; i < num_tasks; ++i) { Task t; cin >> t; tasks.push_back(t); } while(1) { sort(&tasks[0], &tasks[num_tasks]); while(num_tasks > 0 && tasks[num_tasks - 1].size == 0) { --num_tasks; } if(num_tasks == 0) { break; } int now = tasks[0].begin; int next = now + tasks[0].size; for(int i = 1; i < num_tasks; ++i) { int b = tasks[i].begin; if(b > now && b < next) { next = b; } int c = b + tasks[i].size; if(c < next) { next = c; } } for(int i = 0; i < num_tasks; ++i) { if(i < num_cpu) { tasks[i].done(now, next); } else { tasks[i].begin = next; } if(!tasks[i].is_valid()) { cout << "NIE\n"; return 0; } } } cout << "TAK\n"; return 0; } | 
 
            
         English
                    English