Pagini recente » Cod sursa (job #2524440) | Cod sursa (job #2452559) | Cod sursa (job #465236) | Cod sursa (job #2283686) | Cod sursa (job #1904651)
#include<fstream>
#include<cmath>
#include<algorithm>
using namespace std;
int h[2010],b[2010],a[2010],m[2010][2010],start[2010],sum[2010],res;
int i,j,n,nr=0,t,u;
bool ok;
int cmp(int i, int j)
{
return a[i]<a[j];
}
int main()
{
ifstream cin ("psir.in");
ofstream cout ("psir.out");
cin>>n;
for(i=1; i<=n; ++i)
{
cin>>a[i];
h[i]=i;
}
sort(h+1,h+n+1,cmp);
i=1;
while(i<=n)
{
start[++nr]=i;
j=i;
while(a[h[i]]==a[h[i+1]])
++i;
for(t=j; t<=i; ++t)
b[h[t]]=nr;
++i;
}
start[nr+1]=n+1;
for(i=1; i<n; ++i)
{
t=start[b[i]+1];
ok=0;
while(!ok&&t<=n)
{
if(h[t]>i)
ok=1;
else
++t;
}
if(ok)
{
for(j=1; j<i; ++j)
if(a[j]>a[h[t]])
m[i][h[t]]+=m[j][i];
for(j=t+1; j<=n; ++j)
{
m[i][h[j]]=m[i][h[j-1]];
if(a[h[j]]!=a[h[j-1]])
for(u=start[b[h[j]]]; u<start[b[h[j+1]]]; ++u)
if(h[u]<i)
m[i][h[j]]-=m[h[u]][i];
}
}
t=start[b[i]]-1;
ok=0;
while(!ok&&t)
{
if(h[t]>i)
ok=1;
else
--t;
}
if(ok)
{
for(j=1; j<i; ++j)
if(a[j]<a[h[t]])
m[i][h[t]]+=m[j][i];
for(j=t-1; j; --j)
{
m[i][h[j]]=m[i][h[j+1]];
if(a[h[j]]!=a[h[j+1]])
for(u=start[b[h[j]]]; u<start[b[h[j+1]]]; ++u)
if(h[u]<i)
m[i][h[j]]-=m[h[u]][i];
}
}
for(j=i+1; j<=n; ++j)
++m[i][j];
}
for(i=1; i<n; ++i)
for(j=i+1; j<=n; ++j)
res+=m[i][j];
cout<<res<<"\n";
return 0;
}