Pagini recente » Cod sursa (job #3243849) | Cod sursa (job #2748733) | Cod sursa (job #1268808) | Cod sursa (job #2223014) | Cod sursa (job #1815838)
#include <cstdio>
#include <algorithm>
const int MAX_N = 5000;
int v[1+MAX_N], din[1+MAX_N], first[1+MAX_N], tab[1+MAX_N];
int *p[MAX_N];
bool cmp(int *a, int *b) {
return *a < *b;
}
int normalize(int n) {
int last, j;
for(int i = 1; i <= n; ++i)
p[i] = &v[i];
std::sort(p + 1, p + n + 1, cmp);
j = 1;
last = *p[1];
for(int i = 1; i <= n; ++i) {
if(*p[i] == last)
*p[i] = j;
else {
j++;
last = *p[i];
*p[i] = j;
}
}
return j;
}
int main() {
int n, dist, max, size, x, y;
FILE *fin = fopen("secv.in", "r");
fscanf(fin, "%d", &n);
for(int i = 1; i <= n; ++i) {
fscanf(fin, "%d", &v[i]);
}
fclose(fin);
dist = normalize(n);
for(int i = 1; i <= n; ++i) {
x = v[i];
y = tab[x - 1];
if(tab[x - 1] > 0) {
din[i] = din[y] + 1;
first[i] = first[y];
} else {
din[i] = 1;
first[i] = i;
}
if(din[i] > din[tab[x]])
tab[x] = i;
else if(din[i] == din[tab[x]] && first[i] > first[tab[x]])
tab[x] = i;
}
FILE *fout = fopen("secv.out", "w");
max = size = -1;
for(int i = 1; i <= n; ++i)
if(din[i] > max) {
max = din[i];
size = i - first[i] + 1;
} else if(din[i] == max && i - first[i] + 1 < size)
size = i - first[i] + 1;
if(max == dist)
fprintf(fout, "%d", size);
else
fprintf(fout, "-1");
fclose(fout);
return 0;
}