Cod sursa(job #1061460)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 19 decembrie 2013 20:11:11
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

struct elem
{
    int val;
    int poz;
}v[1048580];
int m[1048580];

bool operator<(const elem &a,const elem &b)
{
    if(a.val>b.val)
       return 0;
    return 1;
}

#define lsb(i) (i&(-i))

int aib[1048580];

int sum(int poz)
{
    int s=0;
    for(;poz>0;poz-=lsb(poz))
        s+=aib[poz];
    return s;
}

int n;

void update(int poz,int val)
{
    for(;poz<=n;poz+=lsb(poz))
        aib[poz]+=val;
}

void caut_bin(int x)
{
    int st=0,dr=x,mijl=x>>1;


}

int l,u;

int data[1048580];

int main()
{
    int i,l,u;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>m[i];
        v[i].val=m[i];
        v[i].poz=i;
    }
    sort(v+1,v+n+1);

    int ante=-1,curent=0;
    for(i=1;i<=n;i++)
    {
        if(ante!=v[i].val)
        {
            ante=v[i].val;
            curent++;
        }
        m[v[i].poz]=curent;
    }

    memset(data,-1,sizeof(data));

    for(i=1;i<=n;i++)
    {
        if(data[m[i]]!=-1)
            update(data[m[i]],-1);
        update(i,1);
        data[m[i]]=i;


    }

    return 0;
}