/*
ZADATAK: kartice
JEZIK: C++
*/

//#include <iostream>
#include <fstream>
#include <list>

using namespace std;

const int MAX_n = 3000;
const int HSIZE = 4498493;

struct Point {
       int x, y;

       Point() : x(), y() {}       
       Point(int xx, int yy) : x(xx), y(yy) {}

       friend Point operator-(Point a, Point b)
       {
              if (a.x > b.x) return Point(a.x-b.x, a.y-b.y);
              else return Point(b.x-a.x, b.y-a.y);
       }
       friend bool operator<(Point a, Point b) { return a.y < b.y; }
       friend bool operator==(Point a, Point b) { return a.x==b.x && a.y==b.y; }
};

typedef list<pair<Point,int> >::iterator ITER;

int n;
Point rupa[MAX_n];

list<pair<Point,int> > rel[HSIZE];
int om;

inline size_t fhash(Point p) { return abs( (p.x*19-p.y*23)*(p.x%7)*(p.y%3) ) % HSIZE; }
ITER keres(Point p)
{
     int h = fhash(p);
     ITER i;
     
     if (rel[h].empty()) i = rel[h].end();
     else {
          for (i = rel[h].begin(); i != rel[h].end(); i++)
              if (i->first == p) break;
     }

     if (i != rel[h].end()) return i;
     else {
          rel[h].insert(rel[h].begin(), pair<Point,int>(p, 0));
          return rel[h].begin();
     }
}

int main()
{
    ifstream in("kartice.in");
    ofstream out("kartice.out");

    in>>n;
    
    for (int i=0; i<n; i++) {
        in>>rupa[i].x>>rupa[i].y;
        for (int j=0; j<i; j++) {
            ITER it = keres(rupa[i]-rupa[j]);
            int k = ++(it->second);
            om = max(k, om);
        }
//        for (map<Point,int>::const_iterator it=rel.begin(); it!=rel.end(); it++)
//            cout << it->first.x <<','<< it->first.y <<' '<< it->second<<';';
//        cout<<endl;
        out<<om<<endl;
    }
    
    in.close();
    out.flush(); out.close();

    return 0;
}
