Cod sursa(job #812515)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 13 noiembrie 2012 22:31:27
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
using namespace std;
#include <vector>
ifstream f("secv5.in");
ofstream g("secv5.out");
#define MOD 666013
#define LE  1060000
#define ll int
#define l2 unsigned int
vector<pair<l2,int> > H[MOD];

ll i,j,stanga[LE],dreapta[LE];
l2 a[LE];
ll mind,maxD,E;
ll st;
ll nrdist;
ll n;

void  update(ll value,ll semn)
{
    ll R=value%MOD;
    ll N=H[R].size();

    for(ll i=0;i<N;++i)
      if (H[R][i].first==value)
       {
           H[R][i].second+=semn;
           return;
       }
    H[R].push_back(make_pair(value,1));
}
ll query(ll value)
{
    ll R=value%MOD;
    ll N=H[R].size();

    for(ll i=0;i<N;++i)
      if (H[R][i].first==value)
         return  H[R][i].second;

    return 0;
}

int main()
{
    f>>n>>mind>>maxD;

    for(i=1;i<=n;++i)
     f>>a[i];

    st=1;

    update(a[1],1);

    E=maxD;
    nrdist=1;
    stanga[1]=1;
  if (mind>1)
   stanga[1]=-1;

    for(i=2; i<=n; ++i)
    {
        if (query(a[i])==0)
            ++nrdist;

        update(a[i],1);

        while (nrdist>E)
        {
            update(a[st],-1);

            if (query(a[st])==0)
                --nrdist;
            ++st;
        }

        stanga[i]=st;

        if (st==1&&nrdist<mind)
          stanga[i]=-1;
    }

    for(i=1; i<MOD; ++i)
        H[i].clear();

    E=mind;
    nrdist=1;
    st=1;
    dreapta[1]=1;
    update(a[1],1);

    for(i=2; i<=n; ++i)
    {
        if (query(a[i])==0)
            ++nrdist;

        update(a[i],1);

        while (nrdist>=E)
        {
            update(a[st],-1);

            if (query(a[st])==0)
                --nrdist;

             if (nrdist<E)
             {
                update(a[st],1);
                ++nrdist;
                break;
             }
            ++st;

        }
        dreapta[i]=st;

    }

    long long  nu=0;

    for(i=1;i<=n;++i) if (stanga[i]!=-1)
        nu+=(dreapta[i]-stanga[i]+1);

g<<nu<<'\n';

    f.close();
    g.close();
    return 0;
}