Pues tal y como lo pusiste al principio:
Por ejemplo, se que para acceder al primer elemento es:
int a = (*Cola.begin()).first;
Para el segundo elemento es:
int a = (*Cola.begin()).second.first;
Y etc. Es un pair dentro de un pair dentro de un pair (...).
Teniendo:
pair<int, pair<int, pair<int, pair<int, int> > > > &var = (*Cola.begin());
Sabemos que:
var.first == int
var.second == pair<int, pair<int, pair<int, int> > >
var.second.first == int
var.second.second == pair<int, pair<int, int> >
var.second.second.first == int
Y etc. Simplemente fíjate en qué es cada miembro. El primer second retorna un XXXXX. El segundo retorna un YYYYY.
Y acerca del tema de guardar los pair así, como verás, no es agradable. Has dicho que es una estructura de la forma: "d, x, y, x2, y2". Puedes hacer eso, una estructura o clase:
struct Estado{
int d, x, y, x2, y2;
};
Así, en vez de var.second.second.first, usarías, por ejemplo, "var.y".
Ahora el problema es ordenarlo en el set. Para ello, el set requiere que el objeto tenga un operador "<". Así que hagámoslo:
struct Estado{
int d, x, y, x2, y2;
bool operator<(const Estado& estado){
return d < estado.d;
}
};
En fin, tanto pair como tuple son clases que se debería evitar utilizar salvo que sean realmente necesarias. Es mejor crear una clase con nombre y con campos cuyos nombres sean auto-explicativos.