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 Rust (1.15.1) (judge verdict: Accepted)


#[allow(unused_macros)]
macro_rules ! map { ( ) => { IndexMap ( std :: collections :: HashMap :: new ( ) ) } ; ( $ value : expr ; $ ( $ key : expr ) ,* ) => { IndexMap ( vec ! [ $ ( $ key ) ,* ] . into_iter ( ) . map ( | k | ( k , $ value ) ) . collect ::< std :: collections :: HashMap < _ , _ >> ( ) ) } ; ( $ value : expr ; $ ( $ ( $ key : expr ) ,* ) ;* ) => { map ! ( $ ( $ ( $ key ) ,* ) ;* => $ value ) } ; ( $ ( $ head : expr ) ,*; $ ( $ ( $ tail : expr ) ,* ) ;* => $ init : expr ) => { map ! [ map ! ( $ ( $ ( $ tail ) ,* ) ;* => $ init ) ; $ ( $ head ) ,* ] } ; ( $ ( $ head : expr ) ,* => $ init : expr ) => { map ! [ $ init ; $ ( $ head ) ,* ] } ; }
#[derive(Debug, Clone)]
struct IndexMap<K: Eq + std::hash::Hash, V>(pub std::collections::HashMap<K, V>);
#[allow(dead_code)]
impl<K: Eq + std::hash::Hash + std::clone::Clone, V> IndexMap<K, V> {
    fn keys_vec(&self) -> Vec<K> {
        self.keys().cloned().collect()
    }
}
#[allow(dead_code)]
impl<K, V> std::ops::Deref for IndexMap<K, V>
where
    K: Eq + std::hash::Hash,
{
    type Target = std::collections::HashMap<K, V>;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
#[allow(dead_code)]
impl<'a, K, V, Q: ?Sized> std::ops::Index<&'a Q> for IndexMap<K, V>
where
    K: std::borrow::Borrow<Q> + Eq + std::hash::Hash,
    Q: Ord + Eq + std::hash::Hash,
{
    type Output = V;
    fn index(&self, index: &Q) -> &V {
        self.0.get(index).expect("no entry found for key")
    }
}
#[allow(dead_code)]
impl<'a, K, V> std::ops::IndexMut<&'a K> for IndexMap<K, V>
where
    K: Ord + Eq + std::hash::Hash + Clone,
    V: Default,
{
    fn index_mut(&mut self, index: &K) -> &mut V {
        self.0.entry(index.clone()).or_insert(Default::default());
        self.0.get_mut(index).expect("no entry found for key")
    }
}

fn main() {
    use std::io::Read;
    let mut buf = String::new();
    std::io::stdin().read_to_string(&mut buf).unwrap();
    let mut iter = buf.split_whitespace();
    
    let _: usize = iter.next().unwrap().parse().unwrap();
    let m: usize = iter.next().unwrap().parse().unwrap();
    
    let mut hset: IndexMap<_, Vec<_>> = map![];
    for i in 0..m {
        let p: usize = iter.next().unwrap().parse().unwrap();
        let y: u64 = iter.next().unwrap().parse().unwrap();
        
        hset[&p].push((y, i));
    }
    let mut hset2 = map![];
    for key in hset.keys_vec() {
        hset[&key].sort();
    }
    for key in hset.keys_vec() {
        if let Some(vec) = hset.get(&key) {
            hset2[&key] = vec.iter().enumerate().map(|(j, &(_, i))| (i, j)).collect::<Vec<_>>();
        }
    }
    let mut acc = vec![];
    for (key, value) in hset2.iter() {
        acc.extend(value.iter().cloned().map(|(i, j)| (i, key, j)));
    }
    acc.sort();
    for tpl in acc {
        println!("{:>06}{:>06}", tpl.1, tpl.2+1);
    }
}