#include <algorithm> #include <iostream> #include <cstdio> #include <utility> #include <set> #include <map> #include <queue> using namespace std; typedef long long LL; #define FOR(x,b,e) for(int x=b; x<=(e); ++x) #define REP(x,n) for(int x=0; x<(n); ++x) #define FORD(x,b,e) for(int x=b; x>=(e); --x) typedef pair<int,int> PII; typedef pair<int,pair<int,int> > PIII; #define MP make_pair #define MAXN 1000005 #define ST first #define ND second struct STR{ int ind,c,p; }; int n; vector<STR> t; vector<STR> tr; void pr(const PIII& p){ printf("%d %d %d\n",p.ST,p.ND.ST,p.ND.ND); } struct cmp { inline bool operator() (const STR& p1, const STR& p2){ //pr(p1); pr(p2); if(p1.p == p2.p && p1.c==p2.c) return p1.ind<p2.ind; if(p1.c==p2.c) return p1.ind<p2.ind; return p1.c < p2.c; } }; int main() { LL z; scanf("%d%lld",&n,&z); int a,b; REP(x,n){ STR *str = new STR(); scanf("%d%d",&(str->c),&(str->p)); str->ind=x+1; if(str->c <= str->p){ t.push_back(*str); }else{ swap(str->c, str->p); tr.push_back(*str); } } sort(t.begin(),t.end(),cmp()); sort(tr.begin(),tr.end(),cmp()); //REP(x,t.size()){printf("%d %d %d\n",t[x].ind,t[x].c,t[x].p);} REP(x,t.size()){ //printf("%lld %d\n",z,t[x].c); z -= t[x].c; if(z<=0){ printf("NIE\n"); return 0; } z += t[x].p; } //printf("after z %lld\n",z); LL sum=0; REP(x,tr.size())sum+=tr[x].p-tr[x].c; LL z2 = z - sum; REP(x,tr.size()){ z2 -= tr[x].c; if(z2<=0){ printf("NIE\n"); return 0; } z2+=tr[x].p; } printf("TAK\n"); REP(x,t.size()){ printf("%d ",t[x].ind); } FORD(x,tr.size()-1,0)printf("%d ",tr[x].ind); printf("\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 | #include <algorithm> #include <iostream> #include <cstdio> #include <utility> #include <set> #include <map> #include <queue> using namespace std; typedef long long LL; #define FOR(x,b,e) for(int x=b; x<=(e); ++x) #define REP(x,n) for(int x=0; x<(n); ++x) #define FORD(x,b,e) for(int x=b; x>=(e); --x) typedef pair<int,int> PII; typedef pair<int,pair<int,int> > PIII; #define MP make_pair #define MAXN 1000005 #define ST first #define ND second struct STR{ int ind,c,p; }; int n; vector<STR> t; vector<STR> tr; void pr(const PIII& p){ printf("%d %d %d\n",p.ST,p.ND.ST,p.ND.ND); } struct cmp { inline bool operator() (const STR& p1, const STR& p2){ //pr(p1); pr(p2); if(p1.p == p2.p && p1.c==p2.c) return p1.ind<p2.ind; if(p1.c==p2.c) return p1.ind<p2.ind; return p1.c < p2.c; } }; int main() { LL z; scanf("%d%lld",&n,&z); int a,b; REP(x,n){ STR *str = new STR(); scanf("%d%d",&(str->c),&(str->p)); str->ind=x+1; if(str->c <= str->p){ t.push_back(*str); }else{ swap(str->c, str->p); tr.push_back(*str); } } sort(t.begin(),t.end(),cmp()); sort(tr.begin(),tr.end(),cmp()); //REP(x,t.size()){printf("%d %d %d\n",t[x].ind,t[x].c,t[x].p);} REP(x,t.size()){ //printf("%lld %d\n",z,t[x].c); z -= t[x].c; if(z<=0){ printf("NIE\n"); return 0; } z += t[x].p; } //printf("after z %lld\n",z); LL sum=0; REP(x,tr.size())sum+=tr[x].p-tr[x].c; LL z2 = z - sum; REP(x,tr.size()){ z2 -= tr[x].c; if(z2<=0){ printf("NIE\n"); return 0; } z2+=tr[x].p; } printf("TAK\n"); REP(x,t.size()){ printf("%d ",t[x].ind); } FORD(x,tr.size()-1,0)printf("%d ",tr[x].ind); printf("\n"); return 0; } |