/*
	Rozwiązanie zadania "Samochody dostwcze [C]" (SAM) na Potyczki Algorytmiczne 2020.
	Damian Mazur
*/
#include <stdio.h>

struct samochod
{
	int typ;
	int polozenieGarazu;
	int czasWyjazdu;
	int roznica;
	int powiazaneWypadki;
};

int n;
int iloscSamochodow1 = 0;
int iloscSamochodow2 = 0;
samochod* samochody;
samochod** posortowaneSamochody1;
samochod** posortowaneSamochody2;
int* pozycjeWartosci1;
int* pozycjeWartosci2;

void posortujSamochody(samochod** tablica, int l, int r)
{
	int i = l;
	int j = r;
	int x = tablica[(l + r) / 2]->roznica;
	do
	{
		while (tablica[i]->roznica < x)
		{
			i++;
		}
		while (tablica[j]->roznica > x)
		{
			j--;
		}
		if (i <= j)
		{
			samochod* t = tablica[i];
			tablica[i] = tablica[j];
			tablica[j] = t;
			i++;
			j--;
		}
	} while (i <= j);
	if (l < j)
	{
		posortujSamochody(tablica, l, j);
	}
	if (r > i)
	{
		posortujSamochody(tablica, i, r);
	}
	return;
}

void posortuj()
{
	for (int i = 0; i < n; i++)
	{
		if (samochody[i].typ == 1)
		{
			posortowaneSamochody1[iloscSamochodow1] = samochody + i;
			iloscSamochodow1++;
		}
		else
		{
			posortowaneSamochody2[iloscSamochodow2] = samochody + i;
			iloscSamochodow2++;
		}
	}
	posortujSamochody(posortowaneSamochody1, 0, iloscSamochodow1 - 1);
	posortujSamochody(posortowaneSamochody2, 0, iloscSamochodow2 - 1);
	return;
}

void wyznaczPozycjeWartosci()
{
	int pozycjaI = 0;
	while (pozycjaI <= posortowaneSamochody1[0]->roznica + 1000000)
	{
		pozycjeWartosci1[pozycjaI] = 0;
		pozycjaI++;
	}
	int ostatniaPozycja = posortowaneSamochody1[0]->roznica + 1000000;
	for (int i = 0; i < iloscSamochodow1; i++)
	{
		int obecnaPozycja = posortowaneSamochody1[i]->roznica + 1000000;
		for (int j = ostatniaPozycja; j < obecnaPozycja; j++)
		{
			pozycjeWartosci1[pozycjaI] = i;
			pozycjaI++;
		}
		ostatniaPozycja = obecnaPozycja;
	}
	for (int i = pozycjaI; i < 2000010; i++)
	{
		pozycjeWartosci1[i] = iloscSamochodow1;
	}
	pozycjaI = 0;
	while (pozycjaI <= posortowaneSamochody2[0]->roznica + 1000000)
	{
		pozycjeWartosci2[pozycjaI] = 0;
		pozycjaI++;
	}
	ostatniaPozycja = posortowaneSamochody2[0]->roznica + 1000000;
	for (int i = 0; i < iloscSamochodow2; i++)
	{
		int obecnaPozycja = posortowaneSamochody2[i]->roznica + 1000000;
		for (int j = ostatniaPozycja; j < obecnaPozycja; j++)
		{
			pozycjeWartosci2[pozycjaI] = i;
			pozycjaI++;
		}
		ostatniaPozycja = obecnaPozycja;
	}
	for (int i = pozycjaI; i < 2000010; i++)
	{
		pozycjeWartosci2[i] = iloscSamochodow2;
	}
	return;
}

void powiazWypadki()
{
	if (iloscSamochodow1 > iloscSamochodow2)
	{
		for (int i = 0; i < iloscSamochodow2; i++)
		{
			for (int j = pozycjeWartosci1[posortowaneSamochody2[i]->roznica + 1000000];
				j < pozycjeWartosci1[posortowaneSamochody2[i]->roznica + 1000001]; j++)
			{
				posortowaneSamochody2[i]->powiazaneWypadki++;
				posortowaneSamochody1[j]->powiazaneWypadki++;
			}
		}
	}
	else
	{
		for (int i = 0; i < iloscSamochodow1; i++)
		{
			for (int j = pozycjeWartosci2[posortowaneSamochody1[i]->roznica + 1000000];
				j < pozycjeWartosci2[posortowaneSamochody1[i]->roznica + 1000001]; j++)
			{
				posortowaneSamochody1[i]->powiazaneWypadki++;
				posortowaneSamochody2[j]->powiazaneWypadki++;
			}
		}
	}
}

int wynik()
{
	int wynik = 0;
	while (true)
	{
		int max = 0;
		samochod* maxSamochod = NULL;
		for (int i = 0; i < n; i++)
		{
			if (samochody[i].powiazaneWypadki > max)
			{
				max = samochody[i].powiazaneWypadki;
				maxSamochod = samochody + i;
			}
		}
		if (!max)
		{
			break;
		}
		maxSamochod->powiazaneWypadki = 0;
		if (maxSamochod->typ == 1)
		{
			for (int i = pozycjeWartosci2[maxSamochod->roznica + 1000000];
				i < pozycjeWartosci2[maxSamochod->roznica + 1000001]; i++)
			{
				posortowaneSamochody2[i]->powiazaneWypadki--;
			}
		}
		else
		{
			for (int i = pozycjeWartosci1[maxSamochod->roznica + 1000000];
				i < pozycjeWartosci1[maxSamochod->roznica + 1000001]; i++)
			{
				posortowaneSamochody1[i]->powiazaneWypadki--;
			}
		}
		wynik++;
	}
	return wynik;
}

int main()
{
	scanf("%d", &n);
	samochody = new samochod[n];
	posortowaneSamochody1 = new samochod*[n];
	posortowaneSamochody2 = new samochod*[n];
	pozycjeWartosci1 = new int[2000010];
	pozycjeWartosci2 = new int[2000010];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &samochody[i].typ);
		scanf("%d", &samochody[i].polozenieGarazu);
		scanf("%d", &samochody[i].czasWyjazdu);
		samochody[i].roznica = samochody[i].polozenieGarazu - samochody[i].czasWyjazdu;
		samochody[i].powiazaneWypadki = 0;
	}
	posortuj();
	wyznaczPozycjeWartosci();
	powiazWypadki();
	printf("%d", wynik());
	return 0;
}