Cod sursa(job #432662)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 2 aprilie 2010 16:39:36
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>
#define maxn 100100

using namespace std;

int sir[maxn],sorted[maxn],a[4*maxn];
int n,s,val,poz;
int start,finish,sum;

bool cmp(int x, int y)
{
    if(sir[x]!=sir[y])
        return sir[x]<sir[y];
    return x<y;
}

void update(int nod, int st, int dr)
{
    if(st==dr)
    {
        a[nod]++;
        return;
    }
    else
    {   int mij=(st+dr)/2;
        if(poz<=mij)
            update(nod*2,st,mij);
        else
            update(nod*2+1,mij+1,dr);
        a[nod]=(a[nod*2]+a[nod*2+1])%9917;
    }
}

void query(int nod, int st, int dr)
{
    if(start<=st && dr<=finish)
    {
        sum+=a[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(start<=mij)
        query(nod*2,st,mij);
    if(mij<finish)
        query(nod*2+1,mij+1,dr);
}

int main()
{
    freopen("inv.in","r",stdin);
    freopen("inv.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&sir[i]);
        sorted[i]=i;
    }
    sort(sorted+1,sorted+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        poz=sorted[i];
        start=poz+1;
        finish=n;
        sum=0;
        query(1,1,n);
        s+=sum;
        s%=9917;
        update(1,1,n);
    }
    printf("%d\n",s);
    fclose(stdout);
    return 0;
}