Cod sursa(job #1658887)

Utilizator touristGennady Korotkevich tourist Data 21 martie 2016 20:55:39
Problema P-sir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define Nmax 2005
#define MOD (1u<<32)

using namespace std;

struct el
{
    int val,poz;
    bool operator <(const el &A) const
    {
        return val<A.val;
    }
} v[Nmax];
unsigned int a[Nmax],sum[Nmax][Nmax],n,maxx;

inline void Normalize()
{
    sort(v+1,v+n+1);
    a[v[1].poz]=1;
    for(int i=2;i<=n;++i)
    {
        a[v[i].poz]=a[v[i-1].poz];
        if(v[i].val>v[i-1].val) ++a[v[i].poz];
    }
    maxx=a[v[n].poz];
}

int main()
{
    int sol=0,i,j;
    ifstream cin("psir.in");
    ofstream cout("psir.out");
    cin>>n;
    for(i=1;i<=n;++i)
    {
        cin>>v[i].val;
        v[i].poz=i;
    }
    Normalize();
    for(i=2;i<=n;++i)
    {
        for(j=i-1;j;--j)
        {
            int val;
            if(a[i]==a[j]) val=0;
            else
                if(a[i]>a[j])
                {
                    val=sum[j][maxx]-sum[j][a[i]];
                    if(val<0) val+=MOD;
                }
                else val=sum[j][a[i]-1];
            sol+=val+1;
            if(sol>=MOD) sol-=MOD;
            sum[i][a[j]]+=val+1;
            if(sum[i][a[j]]>=MOD) sum[i][a[j]]-=MOD;
        }
        for(j=2;j<=maxx;++j)
        {
            sum[i][j]+=sum[i][j-1];
            if(sum[i][j]>=MOD) sum[i][j]-=MOD;
        }
    }
    cout<<sol<<"\n";
    return 0;
}