#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>
using namespace std;
template < typename R, typename ... ARGS >
R function_return( R( * ) ( ARGS...) ) ;
template < typename R, typename ... ARGS >
std:: tuple < ARGS...> function_parameters( R( * ) ( ARGS...) ) ;
template < int I, typename T>
using get_type = typename std:: conditional_t < ( I < 0 ) , std:: tuple_element < static_cast < int > ( std:: tuple_size < T> :: value ) + I, T> , std:: tuple_element < I, T>> :: type ;
template < int I, typename T>
using parameter_type = get_type< I, decltype( function_parameters( std:: declval < T> ( ) ) ) > ;
void bar( bool , char , int ) { }
int main( ) {
const parameter_type< - 1 , decltype( bar) > foo = 13 ;
cout << foo << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPHV0aWxpdHk+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFSR1M+ClIgZnVuY3Rpb25fcmV0dXJuKFIoKikoQVJHUy4uLikpOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFSR1M+CnN0ZDo6dHVwbGU8QVJHUy4uLj4gZnVuY3Rpb25fcGFyYW1ldGVycyhSKCopKEFSR1MuLi4pKTsKCnRlbXBsYXRlIDxpbnQgSSwgdHlwZW5hbWUgVD4KdXNpbmcgZ2V0X3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsX3Q8KEkgPCAwKSwgc3RkOjp0dXBsZV9lbGVtZW50PHN0YXRpY19jYXN0PGludD4oc3RkOjp0dXBsZV9zaXplPFQ+Ojp2YWx1ZSkgKyBJLCBUPiwgc3RkOjp0dXBsZV9lbGVtZW50PEksIFQ+Pjo6dHlwZTsKCnRlbXBsYXRlIDxpbnQgSSwgdHlwZW5hbWUgVD4KdXNpbmcgcGFyYW1ldGVyX3R5cGUgPSBnZXRfdHlwZTxJLCBkZWNsdHlwZShmdW5jdGlvbl9wYXJhbWV0ZXJzKHN0ZDo6ZGVjbHZhbDxUPigpKSk+OwoKdm9pZCBiYXIoYm9vbCwgY2hhciwgaW50KSB7fQoKaW50IG1haW4oKSB7CiAgY29uc3QgcGFyYW1ldGVyX3R5cGU8LTEsIGRlY2x0eXBlKGJhcik+IGZvbyA9IDEzOwoKICBjb3V0IDw8IGZvbyA8PCBlbmRsOwp9