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

#include <iostream>
#include <cstdio>

using namespace std;

FILE *inFile;
FILE *outFile;

const int MaxN = 3050;

struct TRupa{
	int x , y;
	
	TRupa(){
	}
	
};

int N;

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

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

void Proveri(int n){
	int distx , disty , maks = 0 , c;
	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 idx1 = 0 ; idx1 < n ; idx1++)
			for (int idx2 = 0 ; idx2 < n ; idx2++)
				if (((R[idx1].x + distx) == R[idx2].x) && ((R[idx1].y + disty) == R[idx2].y)){
					c++;
					break;
				}
		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;
}
