Cod sursa(job #1494751)

Utilizator AlxzAlex Cremeneanu Alxz Data 1 octombrie 2015 20:49:40
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("inv.in");
ofstream fout("inv.out");
int v[100001], arb[400001],i,j,n,x,pos,answ,start,finish;
struct cub
{
    int val;
    int poz;
}a[100002];
int cmp(cub o, cub p)
{
    return o.val<p.val;
}
void update(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]++;
        return;
    }
    int mid=(st+dr)/2;
    if(pos<=mid)
        update(nod*2,st,mid);
    else
        update(nod*2+1,mid+1,dr);
    arb[nod]++;
}
void query (int nod, int st, int dr)
{
    if (st>=start&&dr<=finish)
    {
        answ+=arb[nod];
        return;
    }
    int mid=(st+dr)/2;
    if(start<=mid)
        query(nod*2,st,mid);
    if(mid<finish)
        query(nod*2+1,mid+1,dr);
}
int main()
{
    fin >>n;
    for(i=1;i<=n;i++)
    {
        fin >> a[i].val;
        a[i].poz=i;
    }
    sort(a+1,a+n+1,cmp);
    x=1;
    for(i=1;i<=n;i++)
    {
        if(a[i].poz!=a[i-1].poz)
        {
            v[a[i].poz]=x;
            x++;
        }
        else
            v[a[i].poz]=x;
    }
    for (i=1;i<=n;i++)
    {
        start=v[i]+1;
        finish=n;
        query(1,1,n);
        pos=v[i];
        update(1,1,n);
    }
    fout << answ;
    return 0;
}