/*
ZADATAK: kartice
JEZIK: c++
*/

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

FILE *inFile;
FILE *outFile;

const int MaxN = 3050;

struct TRupa{
	int x , y;
	
	TRupa(){
	}
	
	friend bool operator <(const TRupa& a , const TRupa& b){
		return (a.x < b.x) || ((a.x == b.x) && (a.y < b.y));
	}
	
};

int N;

TRupa R[MaxN];
int D[MaxN];

int maksimum(int x, int y){
	if (x > y)
		return x;
	else
		return y;
}

bool BS(int i, int j, int x, int y){
	int k;
	while ((j - i) > 1){
		k = (int)((i + j) / 2);
		if ((R[k].x == x) && (R[k].y == y))
			return true;
		else if ((R[k].x < x) || ((R[k].x == x) && (R[k].y < y)))
			i = k;
		else
			j = k;
	}
	if (R[i].x == x && R[i].y == y)
		return true;
	else if (R[j].x == x && R[j].y == y)
		return true;
	else
		return false;
}

void Proveri(int n){
	int distx , disty , maks = 0 , c;
	sort(&R[0] , &R[n]);
	for (int i = 0 ; i < n ; i++){
		distx = R[n].x - R[i].x;
		disty = R[n].y - R[i].y;
		c = 1;
		for (int idx = 0 ; idx < n ; idx++)
			if //(((R[idx1].x + distx) == R[idx2].x) && ((R[idx1].y + disty) == R[idx2].y))
			(BS(0 , n - 1 , R[idx].x + distx , R[idx].y + disty)){
					c++;
			}
		if (c > maks)
			maks = c;
	}
	D[n] = maksimum(D[n - 1] , maks);
}

void Init(){
	inFile = fopen("kartice.in" , "r");
	//scanf("%d" , &N);
	fscanf(inFile , "%d" , &N);
	D[0] = 0;
	//scanf("%d %d" , &R[0].x , &R[0].y);
	fscanf(inFile , "%d %d" , &R[0].x , &R[0].y);
	for (int i = 1 ; i < N ; i++){
		//scanf("%d %d" , &R[i].x , &R[i].y);
		fscanf(inFile , "%d %d" , &R[i].x , &R[i].y);
		Proveri(i);
	}
	fclose(inFile);
	
	outFile = fopen("kartice.out" , "w");
	
	for (int i = 0 ; i < N ; i++)
		//printf("%d\n" , D[i]);
		fprintf(outFile , "%d\n" , D[i]);
	fclose(outFile);
	//cin >> N;
}

int main(){
	Init();
	return 0;
}
