Problem:
Score: 300 points

Problem Statement

In Republic of Atcoder, there are N prefectures, and a total of M cities that belong to those prefectures.

City i is established in year Y_i and belongs to Prefecture P_i.

You can assume that there are no multiple cities that are established in the same year.

It is decided to allocate a 12-digit ID number to each city.

If City i is the x-th established city among the cities that belong to Prefecture i, the first six digits of the ID number of City i is P_i, and the last six digits of the ID number is x.

Here, if P_i or x (or both) has less than six digits, zeros are added to the left until it has six digits.

Find the ID numbers for all the cities.

Note that there can be a prefecture with no cities.

Constraints

1 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq P_i \leq N

1 \leq Y_i \leq 10^9

Y_i are all different.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
P_1 Y_1
:
P_M Y_M

Output

Print the ID numbers for all the cities, in ascending order of indices (City 1, City 2, ...).

Sample Input 1

2 3
1 32
2 63
1 12

Sample Output 1

000001000002
000002000001
000001000001

As City 1 is the second established city among the cities that belong to Prefecture 1, its ID number is 000001000002.

As City 2 is the first established city among the cities that belong to Prefecture 2, its ID number is 000002000001.

As City 3 is the first established city among the cities that belong to Prefecture 1, its ID number is 000001000001.

Sample Input 2

2 3
2 55
2 77
2 99

Sample Output 2

000002000001
000002000002
000002000003

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include "bits/stdc++.h"
#pragma GCC optimize("Ofast")

// Begin Header {{{
using namespace std;

#ifndef DEBUG
#define dump(...)
#endif

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define rep(i, n) for (intmax_t i = 0, i##_limit = (n); i < i##_limit; ++i)
#define reps(i, b, e) for (intmax_t i = (b), i##_limit = (e); i <= i##_limit; ++i)
#define repr(i, b, e) for (intmax_t i = (b), i##_limit = (e); i >= i##_limit; --i)
#define var(Type, ...) Type __VA_ARGS__; input(__VA_ARGS__)

constexpr size_t    operator""_zu(unsigned long long value) { return value; };
constexpr intmax_t  operator""_jd(unsigned long long value) { return value; };
constexpr uintmax_t operator""_ju(unsigned long long value) { return value; };

constexpr int INF = 0x3f3f3f3f;
constexpr intmax_t LINF = 0x3f3f3f3f3f3f3f3f_jd;

namespace moke {

template <class T> using MaxHeap = priority_queue<T, vector<T>, less<T>>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;

inline void input() {}
template <class Head, class... Tail> inline void input(Head&& head, Tail&&... tail) {
    cin >> head;
    input(forward<Tail>(tail)...);
}

template <class T> inline void input(vector<T> &vec) {
    for (auto &e: vec) {
        cin >> e;
    }
}

template <class T> inline void input(vector<vector<T>> &mat) {
    for (auto &vec: mat) {
        input(vec);
    }
}

inline void print() { cout << "\n"; }
template <class Head, class... Tail> inline void print(Head&& head, Tail&&... tail) {
    static constexpr const char *delim[] = {"", " "};
    cout << head << delim[sizeof...(tail)];
    print(forward<Tail>(tail)...);
}

template <class T> inline ostream& operator<<(ostream &strm, const vector<T> &vec) {
    static constexpr const char *delim[] = {" ", ""};
    for (const auto &e: vec) {
        strm << e << delim[&e == &vec.back()];
    }
    return strm;
}

template <class T> inline vector<T> make_v(const T &initValue, size_t sz) {
    return vector<T>(sz, initValue);
}

template <class T, class... Args> inline auto make_v(const T &initValue, size_t sz, Args... args) {
    return vector<decltype(make_v<T>(initValue, args...))>(sz, make_v<T>(initValue, args...));
}

template <class A, class B> inline bool chmax(A &a, const B &b) noexcept {
    return b > a && (a = b, true);
}

template <class A, class B> inline bool chmin(A &a, const B &b) noexcept {
    return b < a && (a = b, true);
}

template <class A, class B> inline common_type_t<A, B> min(const A &a, const B &b) noexcept {
    return a < b ? a : b;
}

template <class A, class B, class... Args>
inline common_type_t<A, B, Args...> min(const A &a, const B &b, const Args&... args) noexcept {
    return moke::min(a < b ? a : b, args...);
}

template <class A, class B> inline common_type_t<A, B> max(const A &a, const B &b) noexcept {
    return a > b ? a : b;
}

template <class A, class B, class... Args>
inline common_type_t<A, B, Args...> max(const A &a, const B &b, const Args&... args) noexcept {
    return moke::max(a > b ? a : b, args...);
}

template <class A, class B> inline common_type_t<A, B> diff(const A &a, const B &b) noexcept {
    return a < b ? b - a : a - b;
}

} // namespace moke

// }}} End Header

namespace moke {

// compress {{{
template <class T> map<T, int> compress(vector<T> value) {
    map<T, int> ret;

    sort(value.begin(), value.end());
    value.erase(unique(value.begin(), value.end()), value.end());

    const size_t sz = value.size();
    for (size_t i = 0; i < sz; ++i) {
        ret[value[i]] = i;
    }

    return ret;
}
// }}}

int main_() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    var(size_t, N, M);

    vector<vector<int>> value(N + 1);
    vector<int> p(M), y(M);
    rep(i, M) {
        input(p[i], y[i]);
        value[p[i]].emplace_back(y[i]);
    }

    vector<map<int, int>> zip(N + 1);

    reps(i, 1, N) {
        zip[i] = compress(value[i]);
    }

    rep(i, M) {
        int x = zip[p[i]][y[i]] + 1;
        cout << setw(6) << setfill('0') << p[i];
        cout << setw(6) << setfill('0') << x << "\n";
    }

    return 0;
}

} // namespace moke

signed main() { // {{{
    moke::main_();
    return 0;
} // }}}