unordered_map может работать за линию в худшем случае. Это если происходит много коллизий. Стандартная реализация еще и дико медленная, через связные списки работает и часто использует тривиальные хеши (буквально, значение int берется за значение хеша). Подобрать смертельный тест для такого хэша совсем не сложно. Введите вашей программе на вход координаты деревьев i*8192 - если я правильно понимаю, unordered_map будет работать ооочень долго.
Можно избавиться от таких тривиальных коллизий, если реализовать свою хеш функцию. А там можно хоть
(x * 239017l) % (1<<31)
возвращать. И то, лучше будет.
Еще, чтобы избавиться от постоянных рехешированний можно добавить вот это:
len.reserve(1048576);
len.max_load_factor(0.25);
Говорят, что если заранее зарезервировать место и указать load_factor поменьше, то unordered_map будет раз в 10 быстрее.
Плюс, константа у unorderd_map выше - ибо надо хеши считать и перехешировать всю таблицу, если чисел становится много. Может, оно бы было быстрее для миллиона чисел, а не 100000, как у вас там.