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

using namespace std;
typedef long double ld;
typedef long long ll;
typedef pair<ll, ll> para;
typedef pair<ll, para> potwor;
const int MAX_N = 100009;
const ll INF = 2000000009;

vector <int> poczatek;
vector <potwor> P;
vector <int> koniec;

int main(){
  ll n, z;
  cin >> n >> z;
  ll dodaj=0, odejmij=0;
  ll minpot=INF; /// minimalny potion

  for(int i=1; i<=n; i++){
    ll d, a;
    cin >> d >> a;
    dodaj+=a;
    odejmij+=d;
    minpot=min(minpot, a);
    if(d<=a && d<z){
      poczatek.push_back(i);
    }else{
      potwor A;
      A.first=a;
      A.second.first=d-a;
      A.second.second = i;
      P.push_back(A);
    }
  }
  z=z-odejmij+dodaj;
  bool czy=false;
  if((z)<=minpot){
    cout << "NIE" << endl;
  }else if(z<=0){
    cout << "NIE" << endl;
    }
    else{
    czy=true;
    sort(P.begin(), P.end());
    for(int i=0; i<P.size(); i++){
     if(P[i].first<z){
      z+=P[i].second.first;
      koniec.push_back(P[i].second.second);
     }else{czy=false;}
    }
  if(czy==true){
      cout << "TAK" << endl;
  for(int i=0; i<poczatek.size(); i++){
    cout << poczatek[i] << " ";
  }
    reverse(koniec.begin(), koniec.end());
    for(int i=0; i<koniec.size(); i++){
      cout << koniec[i] << " ";
    }
  }else{cout << "NIE" << endl;}
  }



  return 0;
}