Cod sursa(job #1775018)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 9 octombrie 2016 18:24:35
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.18 kb
#include <cstdio>
#include <vector>
using namespace std;
vector <unsigned int> v[666016],v1[666016];
int u,i,p,j,k,u1[1050000],n,l,r,nr,x1,poz,z;
unsigned int a[1050000];
long long s;
bool ok,o;
int main()
{
    freopen ("secv5.in","r",stdin);
    freopen ("secv5.out","w",stdout);
    scanf ("%d %d %d", &n, &l, &r);
    u=0;
    poz=1;
    for (i=1;i<=n;i++)
    {
        scanf ("%ud", &a[i]);
        x1=a[i]%666013;
        ok=true;
        o=true;
        z=v[x1].size();
        for (j=0;j<z;j++)
        {
            if (v[x1][j]==a[i])
            {
                if (v1[x1][j]==0)
                {
                    nr++;
                    v1[x1][j]++;
                }
                else
                {
                    ok=false;
                    v1[x1][j]++;
                }
                o=false;
                break;
            }
        }
        if (ok==true)
        {
            if (o==true)
            {
                nr++;
                v[x1].push_back(a[i]);
                v1[x1].push_back(1);
            }
            if (nr>l)
            {
                for (j=poz;j<=i;j++)
                {
                    x1=a[j]%666013;
                    z=v[x1].size();
                    for (k=0;k<z;k++)
                    {
                        if (v[x1][k]==a[j])
                        {
                            v1[x1][k]--;
                            break;
                       }
                    }
                    if (v1[x1][k]==0)
                        break;
                }
                poz=j+1;
                nr=l;
                u=j+1;
            }
            if (nr==l)
            {
                for (j=poz;j<=i;j++)
                {
                    x1=a[j]%666013;
                    z=v[x1].size();
                    for (k=0;k<z;k++)
                    {
                        if (v[x1][k]==a[j])
                            break;
                    }
                    if (v1[x1][k]>1)
                        v1[x1][k]--;
                    else
                        break;
                }
                poz=j;
                u=j;
            }
        }
        else if (nr==l)
        {
        for (j=poz;j<=i;j++)
        {
            x1=a[j]%666013;
            z=v[x1].size();
            for (k=0;k<z;k++)
            {
                if (v[x1][k]==a[j])
                    break;
            }
            if (v1[x1][k]>1)
                v1[x1][k]--;
            else
                break;
        }
        poz=j;
        u=j;
        }
        u1[i]=u;
    }
    for (i=0;i<666013;i++)
    {
        v[i].clear();
        v1[i].clear();
    }
    p=1;
    nr=0;
    poz=1;
    s=0LL;
    for (i=1;i<=n;i++)
    {
        x1=a[i]%666013;
        ok=true;
        o=true;
        z=v[x1].size();
        for (j=0;j<z;j++)
        {
            if (v[x1][j]==a[i])
            {
                if (v1[x1][j]==0)
                {
                    nr++;
                    v1[x1][j]++;
                }
                else
                {
                    v1[x1][j]++;
                    ok=false;
                }
                o=false;
                break;
            }
        }
        if (ok==true)
        {
            if (o==true)
            {
                nr++;
                v[x1].push_back(a[i]);
                v1[x1].push_back(1);
            }
            if (nr>r)
            {
                for (j=poz;j<=i;j++)
                {
                    x1=a[j]%666013;
                    z=v[x1].size();
                    for (k=0;k<z;k++)
                    {
                        if (v[x1][k]==a[j])
                        {
                            v1[x1][k]--;
                            break;
                        }
                    }
                    if (v1[x1][k]==0)
                        break;
                }
                nr=r;
                p=j+1;
                poz=j+1;
            }
        }
        s=0LL+s+u1[i]-p+1;
    }
    printf ("%lld", s);
    return 0;
}