Pagini recente » Cod sursa (job #2958353) | Cod sursa (job #1163642) | Cod sursa (job #157269) | Cod sursa (job #1887233) | Cod sursa (job #1226495)
#include <fstream>
#include <algorithm>
#define NMax 5005
using namespace std;
ifstream f("secv.in");
ofstream g("secv.out");
int n, v[NMax], i, stack[NMax], p[NMax], st, dr, mij, lmax, ind, k, recons[NMax], j, ok, so[NMax], vc[NMax];
int main()
{
f>>n;
for (i=1; i<=n; i++)
f>>v[i];
for (i=1; i<=n; i++) {
st=1;
dr=lmax;
while (st<=dr) {
mij=(st+dr)/2;
if (stack[mij] < v[i])
st=mij+1;
else {
dr=mij-1;
ind=mij;
}
}
if (v[i]>stack[lmax]) {
stack[++lmax]=v[i];
p[++k]=lmax;
}
else {
stack[ind]=v[i];
p[++k]=ind;
}
}
ok=1;
int cop=lmax;
for (i=n; i>=1; i--) {
if (p[i]==cop) {
recons[cop]=v[i];
if (ok==1) {
dr=i;
ok=0;
}
st=i;
cop--;
}
}
for (i=1; i<=n; i++) {
vc[i]=v[i];
}
sort(v+1, v+n+1);
so[1]=v[1];
j=1;
for (i=2; i<=n; i++)
if (v[i]!=so[j])
so[++j]=v[i];
ok=1;
if (j!=lmax)
ok=0;
else
for (i=1; i<=lmax; i++)
if (so[i]!=recons[i])
ok=0;
while (vc[st+1]==vc[st])
st++;
while (vc[dr-1]==vc[dr])
dr--;
if (ok==1)
g<<dr-st+1;
else
g<<-1;
return 0;
}