Cod sursa(job #294336)

Utilizator Omega91Nicodei Eduard Omega91 Data 2 aprilie 2009 14:22:32
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include <algorithm>
const int NMAX = 5001;
const int ELMAX = 2000000000;

char bset[(ELMAX >> 3) + 2];

bool bit(char b[], int x, int c = 2)
{
	if (c == 2)
		return b[x >> 3] & 1 << (x & 7);
	else if (c) {
		b[x >> 3] |= 1 << (x & 7);
		return true;
	}
	else {
		b[x >> 3] &= ~(1 << (x & 7));
		return false;
	}
}

int main()
{
	int N, i, unic[NMAX], sir[NMAX], k = 0, sz;
	int left, right;

	
	freopen("secv.in", "r", stdin);
	freopen("secv.out", "w", stdout);
	scanf("%d\n", &N);
	for (i = 0; i != N; ++i) {
		scanf("%d ", sir + i);
		if (!bit(bset, sir[i])) {
			bit(bset, sir[i], 1);
			unic[k++] = sir[i];
		}
	}
	std::sort(unic, unic + k);
	sz = k;
	for (i = k = 0; i != N; ++i)
		if (sir[i] == unic[k]) {
			++k;
			if (k == 1) left = i;
			right = i;
		}
	if (k != sz) {
		printf("-1\n");
		return 0;
	}
	for (i = right, --k; ; --i) {
		if (sir[i] == unic[k]) --k;
		if (k < 0 || i <= left) break;
	}
	left = i;
	printf("%d\n", right - left + 1);
		
	return 0;
}