Cod sursa(job #993652)

Utilizator simaghitaSima Gheorghe Eugen simaghita Data 4 septembrie 2013 11:20:46
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include<cstdio>
#include<algorithm>
#define Nmax (1<<20) + 2
using namespace std;
int fr1[Nmax],fr2[Nmax],c1,c2,n,l,u;
long long a[Nmax],aux[Nmax],sol;
struct str
{
    int val, poz;
    bool operator <(const str &A) const
    {
        return val<A.val;
    }
};
str v[Nmax];

inline void Normalizare()
{
    sort(v+1,v+n+1);
    for(int i = 1;i <= n; ++i)
        a[v[i].poz] = a[v[i-1].poz]+!(v[i].val==v[i-1].val);
}
void Citire()
{
    freopen ("secv5.in", "r",stdin);
    scanf("%d%d%d",&n,&l,&u);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        v[i].val = a[i];
        v[i].poz = i;
    }
}
void Rezolvare()
{
    int st, dr1,dr2;
    fr1[a[1]]=1;
    fr2[a[1]]=1;

    st=dr1=dr2=c1=c2=1;

    while(dr1<=n)
    {
        if(c1<l)
        {
            dr1++;
            if(++fr1[a[dr1]]==1)
                c1++;

        }
        if(c2<=u && dr2<n)
        {
            dr2++;
            if(++fr2[a[dr2]]==1)
                c2++;
        }
        else
        {

            if(c1>=l && c2<=u+1)
            {
                sol+=dr2-dr1;
                if(c2<=u)
                    sol++;
                if(--fr1[a[st]]==0)
                    c1--;
                if(--fr2[a[st]]==0)
                    c2--;
                st++;
            }
        }

    }
}

int main()
{

    Citire();
    Normalizare();
    Rezolvare();
    freopen("secv5.out","w",stdout);
    printf("%lld\n",sol);
    return 0;
}