#include <cstdlib>
#include <cstdio>

const int MaxN = 100010;

struct Candy 
{
	int type;
	int num;
};

int n, differentNum;
int a[MaxN];
Candy B[4];
long long sol;

// da li postoji data vrsta bombona medju trenutnim
int find(int type)
{
	for (int i = 1; i <= 3; i++)
		if (B[i].type == type)
			return i;
	return -1;
}

// naci slobodno mesto da ubacimo trenutnu vrstu
int freeIndex()
{
	for (int i = 1; i <= 3; i++)
		if (B[i].num == 0)
			return i;
}

int main()
{
	freopen("bombone.in", "r", stdin);
    freopen("bombone.out", "w", stdout);

	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	
	differentNum = 0;
	for (int i = 1; i <= 3; i++)
	{
		B[i].type = 0;
		B[i].num = 0;
	}

	sol = 0;
	int left = 1;
	for (int right = 1; right <= n; right++)
	{
		int ind = find(a[right]); // da li vrsta a[right] vec postoji
		if (ind != -1) // ako da, povecati brojac
		{
			B[ind].num++;
		}
		else
		{
			if (differentNum == 3)  // ako ne postoji i imamo 3 razlicite vrste, moramo da izbacujemo
			{
				while (differentNum == 3)
				{
					ind = find(a[left]);
					B[ind].num--;
					left++;
					if (B[ind].num == 0)
					{
						B[ind].type = 0;
						differentNum--;
					}
				}
			}
			ind = freeIndex();        // ubaciti tip a[right] na jedno od 3 slobodna mesta
			B[ind].type = a[right];
			B[ind].num = 1;
			differentNum++;
		}

		sol += (right - left + 1);
	}

	printf("%lld\n", sol);
	return 0;
}