#include <bits/stdc++.h>
using namespace std;
int turn = 1000001;
struct Task {
    Task(int s, int f, int l) : start(s), finish(f), len(l) {}
    int start;
    int finish;
    int len;
};
bool cmp3(const Task& a, const Task& b) {
    return a.start < b.start;
}
bool cmp2(const Task& a, const Task& b) {
    return a.finish < b.finish;
}
int space_left(const Task& a) {
    return a.finish - turn - a.len;
}
bool cmp(const Task& a, const Task& b) {
    return space_left(a) < space_left(b);
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<Task> input;
    for (int i = 0; i < n; i++) {
        int s, f, l;
        cin >> s >> f >> l;
        turn = min(turn, s);
        input.push_back(Task(s, f, l));
    }
    sort(input.begin(), input.end(), cmp3);
    vector<Task> todo;
    vector<Task> current;
    int in = 0;
    bool ret = true;
    while (ret) {
        while (in < input.size() && turn == input[in].start) {
            current.push_back(input[in]);
            in++;
        }
        sort(current.begin(), current.end(), cmp2);
        int step = in < input.size() ? input[in].start - turn : 1000001;
        for (int i = 0; i < current.size(); i++) {
            step = min(step, current[i].len);
            if (space_left(current[i]) == 0) {
                todo.push_back(current[i]);
                current.erase(current.begin() + i);
                --i;
                continue;
            }
            if (space_left(current[i]) < 0) {
                ret = false;
            }
        }
        for (int i = 0; i < todo.size(); i++) {
            step = min(step, todo[i].len);
            if (space_left(todo[i]) < 0) {
                ret = false;
            }
        }
        for (int i = m - todo.size(); i < current.size(); i++) {
            step = min(step, space_left(current[i]));
        }
        int k = m;
        if (todo.size() > m) ret = false;
        for (int i = 0; i < todo.size(); i++) {
            todo[i].len -= step;
            k--;
        }
        for (int i = 0; i < todo.size(); i++) {
            if (todo[i].len == 0) {
                if (todo[i].finish < turn) ret = false;
                todo.erase(todo.begin() + i);
                i--;
            }
        }
        for (int i = 0; i < current.size() || k == 0; i++) {
            current[i].len -= step;
            k--;
        }
        for (int i = 0; i < current.size(); i++) {
            if (current[i].len == 0) {
                if (current[i].finish < turn) ret = false;
                current.erase(current.begin() + i);
                i--;
            }
        }
        turn += step;
        if (in == input.size() && todo.empty() && current.empty()) {
            break;
        }
    }
    if (ret) cout << "TAK" << endl;
    else cout << "NIE" << endl;
    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 | #include <bits/stdc++.h> using namespace std; int turn = 1000001; struct Task { Task(int s, int f, int l) : start(s), finish(f), len(l) {} int start; int finish; int len; }; bool cmp3(const Task& a, const Task& b) { return a.start < b.start; } bool cmp2(const Task& a, const Task& b) { return a.finish < b.finish; } int space_left(const Task& a) { return a.finish - turn - a.len; } bool cmp(const Task& a, const Task& b) { return space_left(a) < space_left(b); } int main() { int n, m; cin >> n >> m; vector<Task> input; for (int i = 0; i < n; i++) { int s, f, l; cin >> s >> f >> l; turn = min(turn, s); input.push_back(Task(s, f, l)); } sort(input.begin(), input.end(), cmp3); vector<Task> todo; vector<Task> current; int in = 0; bool ret = true; while (ret) { while (in < input.size() && turn == input[in].start) { current.push_back(input[in]); in++; } sort(current.begin(), current.end(), cmp2); int step = in < input.size() ? input[in].start - turn : 1000001; for (int i = 0; i < current.size(); i++) { step = min(step, current[i].len); if (space_left(current[i]) == 0) { todo.push_back(current[i]); current.erase(current.begin() + i); --i; continue; } if (space_left(current[i]) < 0) { ret = false; } } for (int i = 0; i < todo.size(); i++) { step = min(step, todo[i].len); if (space_left(todo[i]) < 0) { ret = false; } } for (int i = m - todo.size(); i < current.size(); i++) { step = min(step, space_left(current[i])); } int k = m; if (todo.size() > m) ret = false; for (int i = 0; i < todo.size(); i++) { todo[i].len -= step; k--; } for (int i = 0; i < todo.size(); i++) { if (todo[i].len == 0) { if (todo[i].finish < turn) ret = false; todo.erase(todo.begin() + i); i--; } } for (int i = 0; i < current.size() || k == 0; i++) { current[i].len -= step; k--; } for (int i = 0; i < current.size(); i++) { if (current[i].len == 0) { if (current[i].finish < turn) ret = false; current.erase(current.begin() + i); i--; } } turn += step; if (in == input.size() && todo.empty() && current.empty()) { break; } } if (ret) cout << "TAK" << endl; else cout << "NIE" << endl; return 0; } | 
 
            
         English
                    English