Cod sursa(job #2008620)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 7 august 2017 00:32:11
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#define VAL 1050005
#define MOD 666013
#define UI unsigned int

using namespace std;

UI N, L, U, i, j;
UI v[VAL], a[VAL];
UI b[VAL], be, nr;
long long ANS;
unordered_map <UI, UI> H;
vector < pair <int, int> > V[MOD];
vector < pair <int, int> > :: iterator it;

char buff[VAL];
UI poz=0;

UI citeste()
{
    UI nr=0;
    while (buff[poz]<'0' || buff[poz]>'9')
      if (++poz==VAL)
        fread(buff, 1, VAL, stdin), poz=0;
    while ('0'<=buff[poz] && buff[poz]<='9')
    {
        nr=nr*10+buff[poz]-'0';
        if (++poz==VAL)
          fread(buff, 1, VAL, stdin), poz=0;
    }
    return nr;
}

void Add(UI nr)
{
    UI K=nr % MOD;
    for (it=V[K].begin(); it!=V[K].end(); it++)
    {
        if (it->first==nr)
        {
            it->second++;
            return;
        }
    }
    V[K].push_back(make_pair(nr, 1));
}

void Substract(UI nr)
{
    UI K=nr % MOD;
    for (it=V[K].begin(); it!=V[K].end(); it++)
    {
        if (it->first==nr)
        {
            it->second--;
            return;
        }
    }
}

UI Check(UI nr)
{
    UI K=nr % MOD;
    for (it=V[K].begin(); it!=V[K].end(); it++)
      if (it->first==nr)
        return it->second;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    N=citeste();
    L=citeste();
    U=citeste();
    be=1;
    for (i=1; i<=N; i++)
      v[i]=citeste();
    i=0;
    while (nr<U)
    {
        i++;
        if (i>N)
          break;
        Add(v[i]);
        if (Check(v[i])==1)
          nr++;
    }
    a[i]=1;
    be=1;
    while (i<N)
    {
        i++;
        Add(v[i]);
        if (Check(v[i])==1)
          nr++;
        while (nr>U)
        {
            Substract(v[be]);
            if (Check(v[be])==0)
              nr--;
            be++;
        }
        a[i]=be;
    }
    for (i=1; i<=N; i++)
      V[v[i] % MOD].clear();
    i=0;
    nr=0;
    while (nr<L)
    {
        i++;
        if (i>N)
          break;
        Add(v[i]);
        if (Check(v[i])==1)
          nr++;
    }
    be=1;
    for (j=i; j<=N; j++)
    {
        while (nr>=L)
        {
            Substract(v[be]);
            if (Check(v[be])==0)
              nr--;
            be++;
        }
        be--;
        nr++;
        Add(v[be]);
        b[j]=be;
        Add(v[j+1]);
        if (Check(v[j+1])==1)
          nr++;
    }
    for (i=1; i<=N; i++)
    {
        if (a[i]==0 && b[i]>0)
          ANS+=b[i];
        if (a[i]>0 && b[i]>0)
          ANS+=b[i]-a[i]+1;
    }
    printf("%lld\n", ANS);
    return 0;
}