#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int n;

typedef struct Block
{
	int d;
	int p;
	int q;
} B;

int F[5000][5];
int H[5];

B blocks[1000];

int highest(int r, int l)
{
	int max = 0;
	for(int i=r; i<l; i++)
	{
		if(max < H[i])
		{
			max =H[i];
		}
	}
	return max;
}

void yoko_set(B b)
{
	int hp = highest(b.q, b.p+b.q);
	for(int i=b.q; i<b.p+b.q; i++)
	{
		F[hp][i] =1;
		H[i] = hp+1;
	}
}

void tate_set(B b)
{
	int hp = H[b.q];
	for(int i=hp; i<hp+b.p; i++)
	{
		F[i][b.q] = 1;
	}
	H[b.q] = hp+b.p;
}

void col_clear()
{
	
	int hp = highest(0, 5);
	bool is_ok = false;
	vector<int> cols;
	for(int i=0; i<=hp; i++)
	{
		is_ok =true;
		for(int j=0; j<5; j++)
		{
			if(F[i][j]==1) continue;
			is_ok = false;
			break;
		}
		
		if(is_ok)
		{
			cols.push_back(i);
		}
	}
	
	if(cols.empty()) return;
	
	int c = 0;
	for(int i=0; i<hp; i++)
	{
		if(cols[c]==i)
		{
			c++;
			continue;
		}
		
		for(int j=0; j<5; j++)
		{
			F[i-c][j] = F[i][j];
		}
	}
	
	for(int i=hp-cols.size(); i<hp; i++)
	{
		for(int j=0; j<5; j++)
		{
			F[i][j] = 0;
		}
	}
	
	for(int j=0; j<5; j++)
	{
		int max = 0;
		for(int i=0; i<hp; i++)
		{
			if(F[i][j]==1)
			{
				max = i;
			}
		}
		H[j] =max+1;
	}
}

int main()
{
	while(cin >> n, n)
	{
		for(int i=0; i<n; i++)
		{
			cin >> blocks[i].d;
			cin >> blocks[i].p;
			cin >> blocks[i].q;
			blocks[i].q--;
		}
		
		memset(&F[0][0], 0, sizeof(int)*25000);
		memset(&H[0], 0, sizeof(int)*5);
		
		for(int i=0; i<n; i++)
		{
			if(blocks[i].d == 2)
			{
				tate_set(blocks[i]);
			}
			else
			{
				yoko_set(blocks[i]);
			}
			
			col_clear();
		}
		
		int hp = highest(0, 5);
		int c = 0;
		for(int i=0; i<hp; i++)
		{
			for(int j=0; j<5; j++)
			{
				if(F[i][j]==1) c++;
			}
		}
		cout << c<< endl;
	}
	
	return 0;
}