Cod sursa(job #2148542)

Utilizator smashsmash everything smash Data 1 martie 2018 19:47:15
Problema P-sir Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include<algorithm>
using namespace std;
ifstream cin ("psir.in");
ofstream cout ("psir.out");
unsigned int best[2010][2010],k,big[2010],small[2010],sol; long long t=1;
int n,date[2010];
struct bla
{
    int p,v;
} data[2010];
bool sortare (bla q,bla w)
{
    return q.v<w.v;
}
void read ()
{
    cin>>n; for(int i=1;i<=31;i++) t*=2;
    t*=2;
    for(int i=1;i<=n;i++)
        cin>>date[i],data[i].v=date[i],data[i].p=i;
    sort(data+1,data+n+1,sortare);
    for(int i=1;i<=n;i++)
    { int mic=1000000000,mare=0;
        for(int j=1;j<=n;j++)
        {
            if(date[i]==data[j].v) mic=min(mic,j-1),mare=max(mare,j);
        } small[i]=mic; big[i]=mare;
    }
}
void solve ()
{
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(data[j].p<i)
            {   unsigned int sum=1;
                if(data[j].v>date[i]) sum=(sum+best[data[j].p][small[i]])%t;
                else if(data[j].v<date[i]) sum=(sum+best[data[j].p][n]-best[data[j].p][big[i]])%t;
               if(sum<0) sum+=t; best[i][j]=(best[i][j-1]+sum)%t; sol=(sol+sum)%t;
            } else best[i][j]=best[i][j-1];
        }
    }
    cout<<sol;
}
int main()
{
    read();
    solve();
    cin.close();
    cout.close();
    return 0;
}