Cod sursa(job #382127)

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

int main ()
{
    int i,st,dr,m,r1,r2,r,a,nrel=0,ult;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&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<=n;i++)
        f[i]=0;
    r2=spsecv(l-1);
    r=r1-r2;
    printf("%d\n",r);
    return 0;
}