Language: C++

#include<iostream>
#include<vector>
#include<complex>
#include<map>
#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];
int dp[(1<<N)];
int colorstart[5];

int search(int state,st *in,int n){
  if (state == (1<<n))return 0;
  int &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:66:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   66 | main(){
      | ^~~~
a.cc: In function 'int main()':
a.cc:73:10: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'double')
   73 |       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,
                 from a.cc:1:
/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:73:24: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'long long int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'float&' to a value of type 'double'
   73 |       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:73:24: error: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double'
   73 |       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 = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  227 |       operator>>(long double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:227:7: note:   conversion of argument 1 would be ill-formed:
a.cc:73:24: error: cannot bind non-const lvalue reference of type 'long double&' to a value of type 'double'
   73 |       cin>>in[i].a.real()>>in[i].a.imag()>>in[i].r>>in[i].color;
      |            ~~~~~~~~~~~~^~
/usr/include/c++/14/istream:328:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  328 |       operator>>(void*& __p)
      |       ^~~~~~~~
/usr/include/c++/14/istream:328:25: note:   no known conversion for argument 1 from 'double' to 'void*&'
  328 |       operator>>(void*& __p)
      |                  ~~~~~~~^~~
/usr/include/c++/14/istream:122:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__istream_type& (*)(__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:122:36: note:   no known conversion for argument 1 from 'double' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&)' {aka 'std::basic_istream<char>& (*)(std::basic_istream<char>&)'}
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/istream:126:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__ios_type& (*)(__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>; __ios_type = std::basic_ios<char>]'
  126 |       operator>>(__ios_type& (*__pf)(__ios_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:126:32: note:   no known conversion for argument 1 from 'double' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&)' {aka 'std::basic_ios<char>& (*)(std::basic_ios<char>&)'}
  126 |       operator>>(__ios_type& (*__pf)(__ios_type&))
      |