#include <iostream>
#include <set>
#include <iterator>
#include <vector>
#include <functional>
using namespace std;

template<typename C, 
         typename T = typename 
                      C::value_type>
T third_max_val(const C& coll)
{
    set<T, greater<T>> ret;
    for(const auto& el : coll)
    {
        ret.insert(el);
        if(ret.size() > 3u)
            ret.erase(prev(ret.end()));
    }
    return *ret.crbegin();
}

int main() {
	vector<int> nums{1,4,9,3,2,8,7};
    cout << third_max_val(nums) << endl;
	return 0;
}