Pagini recente » Cod sursa (job #1282260) | Cod sursa (job #99059) | Cod sursa (job #2948052) | Cod sursa (job #2836151) | Cod sursa (job #67854)
Cod sursa(job #67854)
#include<stdio.h>
#include<stdlib.h>
#define Nm 2001
int P[Nm],n;
unsigned Nr[Nm][Nm],sol;
void read()
{
int i;
freopen("psir.in","r",stdin);
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",P+i);
}
int cmp1(const void *x, const void *y)
{
return P[*(int*)x]-P[*(int*)y];
}
int cmp2(const void *x, const void *y)
{
return P[*(int*)y]-P[*(int*)x];
}
void solve()
{
int A[Nm],AA[Nm],B[Nm],BB[Nm],i,j,nra,nrb,nraa,nrbb;
unsigned Mod=4294967295u,sa,sb;
for(j=n-1;j;--j)
{
nra=nrb=sa=sb=0;
for(i=j+1;i<=n;++i)
{
Nr[j][i]=((long long)Nr[j][i]+1)&Mod;
if(P[i]>P[j])
{
A[nra++]=i;
sa=((long long)sa+Nr[j][i])&Mod;
}
else
if(P[i]<P[j])
{
B[nrb++]=i;
sb=((long long)sb+Nr[j][i])&Mod;
}
}
qsort(A,nra,sizeof(int),cmp1);
qsort(B,nrb,sizeof(int),cmp2);
nraa=nrbb=0;
for(i=1;i<j;++i)
if(P[i]>P[j])
AA[nraa++]=i;
else
if(P[i]<P[j])
BB[nrbb++]=i;
qsort(AA,nraa,sizeof(int),cmp2);
qsort(BB,nrbb,sizeof(int),cmp1);
for(i=0;i<nraa;++i)
{
while(nra && P[A[nra-1]]>P[AA[i]])
{
--nra;
sa-=Nr[j][A[nra]];
if(sa<0)
sa+=Mod;
}
Nr[AA[i]][j]=((long long)Nr[AA[i]][j]+sa)&Mod;
}
for(i=0;i<nrbb;++i)
{
while(nrb && P[B[nrb-1]]<P[BB[i]])
{
--nrb;
sb-=Nr[j][B[nrb]];
if(sb<0)
sb+=Mod;
}
Nr[BB[i]][j]=((long long)Nr[BB[i]][j]+sb)&Mod;
}
}
for(i=1;i<=n;++i)
for(j=i+1;j<=n;++j)
sol=((long long)sol+Nr[i][j])&Mod;
}
void write()
{
freopen("psir.out","w",stdout);
printf("%u\n",sol);
}
int main()
{
read();
solve();
write();
return 0;
}