Cod sursa(job #1162256)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 31 martie 2014 18:48:56
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<cstdio>
#define maxn 300005
#include<vector>
#include<algorithm>
using namespace std;
unsigned int n,nr,num;
vector <pair <int, unsigned int> > V;
vector <unsigned int> C;
int v[maxn],poz;
void update(int i,int left, int right){
    if(left==right){
        ++v[i];
    }
    else{
    int mij=(left+right)/2;
    if(poz<=mij)
        update(2*i,left,mij);
    else
        update(2*i+1,mij+1,right);
    ++v[i];
    }


}
void query(int i,int left,int right){
    if(left>poz ){
        //if(left!=right)
        num+=v[i];
       //   printf("DA%d %d %d %d \n",left,poz,right,v[i]);

       // else
        //num+=0;
    return;
    }

        //printf("NU:%d %d %d %d \n",left,poz,right,v[i]);
        int mij=(left+right)/2;
       // query(2*i,left,mij);
        //printf("l,m,r:%d %d %d\n",left,mij,right);
        if(mij<=poz)
        query(2*i+1,mij+1,right);
        else
        if(mij>poz){
        query(2*i,left,mij);
        query(2*i+1,mij+1,right);
        }
//}
    //else{


    //}

}



/*int compare( const pair<int,int> a, const pair<int,int> b){
    return a.first<b.first;
} */
int main(){
    freopen("inv.in","r",stdin);
    freopen("inv.out","w",stdout);
    scanf("%u",&n);
    C.resize(n+2);

    V.push_back(make_pair(0,0));
    for(int i=1;i<=n;++i){
        scanf("%d",&nr);
        V.push_back(make_pair(nr,i));
    }
    sort(V.begin()+1,V.begin()+n+1);



    C[V[1].second]=1;

    for(int i=2;i<=n;++i){
        if(V[i-1].first==V[i].first)
            C[V[i].second]=C[V[i-1].second];
        else
            C[V[i].second]=C[V[i-1].second]+1;
    }


    for(int i=1;i<=n;++i){
        poz=C[i];
        //printf("apeluri pentru:%d\n",nr);
        query(1,1,n);
        update(1,1,n);
    }

    printf("%d",num);
    return 0;
}