#include<iostream>
using namespace std;


template<typename T> T  max(T a,T b)   {cerr<<"T "<<endl;return (a>b)?a:b;}

template<typename T> T max(T *data,size_t n) {
T _max = data[0];
 cerr<<"T[]"<<endl;
for(size_t i=0;i<n;++i)
	if(data[i]>_max) 
	  _max=data[i];
return _max;
}

template<typename T> T* max(T *a,T *b) {cerr<<"T*"<<endl;return ((*a)>(*b))?a:b;}

main() {
  int i;
  int j;
  double x[5]={1,2,4,0,3};
  const int *pi=&i;
  const int *pj=&j;

  ::max(i,j);
  ::max(&i,&j);

  ::max(x,5);

}
