Cod sursa(job #383266)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 16 ianuarie 2010 11:16:08
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#include<algorithm>
#define ll long long
using namespace std;
int n,u,l,nr,f[1050001];
unsigned int v[1050001],v2[1050001];
ll spsecv(int lim)
{
    int nrdif=0,i;
    int st=0;
    ll sol=0;
    for(i=1;i<=n;i++)
    {
        if(!f[v[i]])
            nrdif++;
        f[v[i]]++;
        while(st<i && nrdif>lim)
        {
            st++;
            f[v[st]]--;
            if(!f[v[st]])
                nrdif--;
        }
        sol+=i-st;
    }
    return sol;
}

int main ()
{
    int i,st,dr,m=0,nrel=0,ult;
    ll r1,r2,r;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for(i=1;i<=n;i++)
    {
        scanf("%u",&v[i]);
        v2[i]=v[i];
    }
    sort(v2+1,v2+n+1);
    ult=-1;
    for(i=1;i<=n;i++)
        if(v2[i]!=ult)
        {
            v2[++nrel]=v2[i];
            ult=v2[i];
        }
    for(i=1;i<=n;i++)
    {
        st=1;
        dr=nrel;
        while(st<=dr)
        {
            m=(st+dr)/2;
            if(v2[m]<v[i])
                st=m+1;
            else
                if(v2[m]>v[i])
                    dr=m-1;
                else
                    break;
        }       //cautare binara
        v[i]=m;
    }
    r1=spsecv(u);
    for(i=1;i<=nrel;i++)
        f[i]=0;
    r2=spsecv(l-1);
    r=r1-r2;
    printf("%lld\n",r);
    return 0;
}