Cod sursa(job #1267700)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 20 noiembrie 2014 09:07:55
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <algorithm>
#define Nmax 1050000

using namespace std;

struct el
{
    unsigned int val,poz;
    bool operator <(const el &A) const
    {
        return val<A.val;
    }
};
el v[Nmax];

unsigned int n,a[Nmax],frj[Nmax],frk[Nmax],cntj,cntk;

inline void Normalize()
{
    int i;
    sort(v+1,v+n+1);
    a[v[1].poz]=1;
    for(i=2;i<=n;++i)
        if(v[i].val==v[i-1].val)
            a[v[i].poz]=a[v[i-1].poz];
        else
            a[v[i].poz]=a[v[i-1].poz]+1;
}

inline bool Ok(int p)
{
    if(frj[a[p]]==1) return false;
    return true;
}

int main()
{
    unsigned int L,U,i,j,k;
    long long sol=0;
    freopen ("secv5.in","r",stdin);
    freopen ("secv5.out","w",stdout);
    scanf("%d%d%d", &n,&L,&U);
    for(i=1;i<=n;++i)
    {
        scanf("%ud", &v[i].val);
        v[i].poz=i;
    }
    Normalize();
    for(i=j=k=1;i<=n;++i)
    {
        if(++frj[a[i]]==1) ++cntj;
        if(++frk[a[i]]==1) ++cntk;
        while(j<i && ((cntj==L && Ok(j)) || cntj==L+1))
        {
            --frj[a[j]];
            if(frj[a[j]]==0) --cntj;
            ++j;
        }
        while(k<j && cntk==U+1)
        {
            --frk[a[k]];
            if(frk[a[k]]==0) --cntk;
            ++k;
        }
        //printf("%d %d\n", j,k);
        if(cntj>=L && cntk<=U)
        {
            //printf("YES\n");
            sol+=(j-k+1);
        }
        else
            printf("NO\n");
    }
    printf("%lld\n", sol);
    return 0;
}