Language: C++

#include<iostream>
#include<vector>
#include<complex>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
const int N = 24;
const double eps = 1e-10;
typedef complex<double> P;
class st{
public:
  P a;
  double r;
  int color;
  int id;
  bool operator<(const st & a)const{
    if (color != a.color)return color < a.color;
    return id < a.id;
  }
};

int over[N];

int is_intersected_circle(P a,P b,double r1,double r2){
  double d=abs(a-b);
  if (d < eps && abs(r1-r2) < eps)return 3;
  if (d+r2 < r1)return 0;
  if (d+r1 < r2)return 1;
  if (d > r1+r2) return 4;
  if (abs((r1+r2)-d) < eps)return 4;
  return 2;
}

vector<int> edge[N];
short dp[(1<<N)];
int colorstart[5];

short search(int state,st *in,int n){
  if (state == (1<<n))return 0;
  short &ret = dp[state];
  if (ret == -1){
    ret=0;
    //color1
    rep(k,4){
      REP(i,colorstart[k],colorstart[k+1]){
        int now=in[i].id;
        if (((1<<now)&state) != 0)continue;
        if ((over[now]&state) == over[now]);
        else continue;
        REP(j,i+1,colorstart[k+1]){
          int next=in[j].id;
          if (((1<<next)&state) != 0)continue;
          if ((over[next]&state) == over[next]);
          else continue;
          //cout <<"remove " << now <<" " << next << endl;
          ret=max(ret,2+search(state|(1<<now)|(1<<next),in,n));
        }
      }
    }
  }
  return ret;
}

main(){
  int n;
  while(cin>>n && n){
    rep(i,(1<<n))dp[i]=-1;
    rep(i,n)edge[i].clear();
    st in[n];
    rep(i,n){
      cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      in[i].id=i;
    }
    sort(in,in+n);
    rep(i,n){
      rep(j,n){
        if (in[i].id <= in[j].id)continue;
        int tmp=is_intersected_circle(in[i].a,in[j].a,in[i].r,in[j].r);
        if (tmp == 0 || tmp == 1 || tmp == 2 || tmp == 3){
          edge[in[i].id].push_back(in[j].id);
        }
      }
    }

    rep(i,n){
      int now=in[i].id;
      over[now]=0;
      rep(j,edge[now].size()){
        int next=edge[now][j];
        over[now]|=(1<<next);
        //cout <<next << " is over " << now << endl;
      }
      //cout << now <<" hoge " << over[now] << endl;
    }
    rep(i,5)colorstart[i]=n;
    rep(i,n){
      colorstart[in[i].color-1]=min(colorstart[in[i].color-1],i);
    }

    //rep(i,5)cout << colorstart[i] << " ";cout << endl;
    cout << search(0,in,n) << endl;
  }
  return false;
}

Compiler output:
a.cc: In function 'short int search(int, st*, int)':
a.cc:59:18: error: no matching function for call to 'max(short int&, int)'
   59 |           ret=max(ret,2+search(state|(1<<now)|(1<<next),in,n));
      |               ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/14/string:51,
                 from /usr/include/c++/14/bits/locale_classes.h:40,
                 from /usr/include/c++/14/bits/ios_base.h:41,
                 from /usr/include/c++/14/ios:44,
                 from /usr/include/c++/14/ostream:40,
                 from /usr/include/c++/14/iostream:41,
                 from a.cc:1:
/usr/include/c++/14/bits/stl_algobase.h:257:5: note: candidate: 'template<class _Tp> constexpr const _Tp& std::max(const _Tp&, const _Tp&)'
  257 |     max(const _Tp& __a, const _Tp& __b)
      |     ^~~
/usr/include/c++/14/bits/stl_algobase.h:257:5: note:   template argument deduction/substitution failed:
a.cc:59:18: note:   deduced conflicting types for parameter 'const _Tp' ('short int' and 'int')
   59 |           ret=max(ret,2+search(state|(1<<now)|(1<<next),in,n));
      |               ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/bits/stl_algobase.h:303:5: note: candidate: 'template<class _Tp, class _Compare> constexpr const _Tp& std::max(const _Tp&, const _Tp&, _Compare)'
  303 |     max(const _Tp& __a, const _Tp& __b, _Compare __comp)
      |     ^~~
/usr/include/c++/14/bits/stl_algobase.h:303:5: note:   candidate expects 3 arguments, 2 provided
In file included from /usr/include/c++/14/algorithm:61,
                 from a.cc:5:
/usr/include/c++/14/bits/stl_algo.h:5706:5: note: candidate: 'template<class _Tp> constexpr _Tp std::max(initializer_list<_Tp>)'
 5706 |     max(initializer_list<_Tp> __l)
      |     ^~~
/usr/include/c++/14/bits/stl_algo.h:5706:5: note:   candidate expects 1 argument, 2 provided
/usr/include/c++/14/bits/stl_algo.h:5716:5: note: candidate: 'template<class _Tp, class _Compare> constexpr _Tp std::max(initializer_list<_Tp>, _Compare)'
 5716 |     max(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
/usr/include/c++/14/bits/stl_algo.h:5716:5: note:   template argument deduction/substitution failed:
a.cc:59:18: note:   mismatched types 'std::initializer_list<_Tp>' and 'short int'
   59 |           ret=max(ret,2+search(state|(1<<now)|(1<<next),in,n));
      |               ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc: At global scope:
a.cc:67:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   67 | main(){
      | ^~~~
a.cc: In function 'int main()':
a.cc:74:10: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'double')
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |       ~~~^~~~~~~~~~~~~~~~
      |       |                |
      |       |                double
      |       std::istream {aka std::basic_istream<char>}
In file included from /usr/include/c++/14/iostream:42:
/usr/include/c++/14/istream:170:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  170 |       operator>>(bool& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:170:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:174:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  174 |       operator>>(short& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:174:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:177:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  177 |       operator>>(unsigned short& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:177:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:181:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  181 |       operator>>(int& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:181:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:184:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  184 |       operator>>(unsigned int& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:184:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:188:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  188 |       operator>>(long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:188:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:192:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  192 |       operator>>(unsigned long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:192:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:199:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  199 |       operator>>(long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:199:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'long long int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:203:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  203 |       operator>>(unsigned long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:203:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:219:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  219 |       operator>>(float& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:219:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'float&' to a value of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:223:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  223 |       operator>>(double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:223:7: note:   conversion of argument 1 would be ill-formed:
a.cc:74:24: error: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double'
   74 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:227:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = c