1385 2022. 08. 30 13:33:57 mraron Dinók cpp17 Accepted 100/100 103ms 33448 KiB
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<cassert>
#include<cassert>
#include<unordered_map>
#include<unordered_set>
#include<functional>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<sstream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<numeric>
#include<random>
#include<chrono>
#include<bitset>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define xx first
#define yy second
#define sz(x) (int)(x).size()
#define gc getchar
#define IO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define mp make_pair
#define ins insert

#ifndef ONLINE_JUDGE
#  define LOG(x) (cerr << #x << " = " << (x) << endl)
#else
#  define LOG(x) ((void)0)
#endif

using ll = long long;
using ull = unsigned long long ;
using ld = long double ;
using str = string;
using ordered_set=tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag, tree_order_statistics_node_update>;

const double PI=acos(-1);
const ll INF = 1LL<<62;
const ll MINF = -(1LL<<62);

template<typename T> T getint() {
    T val=0;
    char c;
    
    bool neg=false;
    while((c=gc()) && !(c>='0' && c<='9')) {
        neg|=c=='-';
    }

    do {
        val=(val*10)+c-'0';
    } while((c=gc()) && (c>='0' && c<='9'));

    return val*(neg?-1:1);
}

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); uniform_int_distribution<int>(0, n-1)(rng)

vector<int> adj[200001];
int indeg[200001];
void add_edge(int x, int y) {
    adj[x].push_back(y);
    indeg[y]++;
}

vector<int> ord;
int st[200001];
int pos[200001];
void dfs(int x) {
    if(indeg[x]==0) {
        st[x]=1;
        ord.pb(x);
        pos[x]=sz(ord)-1;
        for(auto i:adj[x]) {
            indeg[i]--;
            if(indeg[i]==0) {
                dfs(i);
            }
        }
    }
}

int main() {
    IO;
    int n,m;
    cin>>n>>m;
    vector<array<int,3>> t(m);
    for(int i=0;i<n;++i) {
        add_edge(2*i, 2*i+1);
    }
    for(int i=0;i<m;++i) {
        cin>>t[i][0]>>t[i][1]>>t[i][2];
        
        t[i][1]--;
        t[i][2]--;
        
        if(t[i][0]==1) {
            add_edge(t[i][1]*2, t[i][2]*2+1);
            add_edge(t[i][2]*2, t[i][1]*2+1);
        }else {
            add_edge(t[i][1]*2+1, t[i][2]*2);
        }
    }

    for(int i=0;i<2*n;++i) {
        if(!st[i]) dfs(i);
    }

    if(ord.size()==2*n) {
        cout<<"IGEN\n";
        for(int i=0;i<n;++i) {
            cout<<pos[2*i]+1<<" "<<pos[2*i+1]+1<<"\n";
        }
    }else {
        cout<<"NEM\n";
    }

    return 0;
}
Subtask Sum Test Verdict Time Memory
subtask1 0/0
1 Accepted 6ms 11260 KiB
2 Accepted 6ms 11512 KiB
3 Accepted 8ms 12728 KiB
subtask2 5/5
4 Accepted 90ms 28384 KiB
5 Accepted 71ms 26376 KiB
6 Accepted 52ms 25792 KiB
subtask3 15/15
7 Accepted 4ms 12540 KiB
8 Accepted 6ms 12756 KiB
9 Accepted 6ms 12832 KiB
10 Accepted 6ms 13076 KiB
11 Accepted 6ms 13308 KiB
12 Accepted 6ms 13388 KiB
subtask4 10/10
13 Accepted 6ms 13212 KiB
14 Accepted 6ms 13212 KiB
15 Accepted 6ms 13284 KiB
16 Accepted 4ms 13532 KiB
17 Accepted 4ms 13612 KiB
subtask5 35/35
18 Accepted 4ms 13724 KiB
19 Accepted 4ms 13904 KiB
20 Accepted 87ms 33008 KiB
21 Accepted 86ms 32892 KiB
22 Accepted 4ms 13680 KiB
23 Accepted 6ms 14136 KiB
24 Accepted 79ms 33448 KiB
subtask6 35/35
25 Accepted 90ms 31352 KiB
26 Accepted 97ms 31468 KiB
27 Accepted 90ms 31420 KiB
28 Accepted 101ms 31468 KiB
29 Accepted 75ms 32396 KiB
30 Accepted 103ms 32048 KiB
31 Accepted 103ms 31640 KiB
32 Accepted 75ms 32388 KiB
33 Accepted 71ms 33236 KiB
34 Accepted 90ms 31648 KiB
35 Accepted 79ms 31216 KiB