Cod sursa(job #1409726)

Utilizator EpictetStamatin Cristian Epictet Data 30 martie 2015 18:05:19
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <cstring>
#include <vector>
#define MOD 666013
using namespace std;
ifstream fin ("secv5.in");
ofstream fout ("secv5.out");
unsigned int N, L, U, nr, V[(1 << 20) + 16];
vector < pair < unsigned int, unsigned int > > H[MOD + 16];
int fr[(1 << 20) + 16];

void Read_Data();
int Find_H(int, unsigned int);
void Insert_H(int);
long long Solve(int);
void Write_Data();

int main()
{
    Read_Data();
    Write_Data();
    return 0;
}

void Write_Data()
{
    fout << Solve(U) - Solve(L - 1) << '\n';
    fout.close();
}

long long Solve(int dim)
{
    memset(fr, 0, sizeof(fr));
    int num = 0, st = 1;
    long long sol = 0;
    for (int i = 1; i <= N; i++)
    {
        int x = Find_H(V[i] % MOD, V[i]);
        if (!fr[x])
        {
            fr[x] = 1;
            if (num == dim)
            {
                x = Find_H(V[st] % MOD, V[st]);
                while (fr[x])
                {
                    x = Find_H(V[st] % MOD, V[st]);
                    fr[x]--;
                    st++;
                }
            }
            else num++;
        }
        else
        {
            fr[x] += 1;
        }
        sol += (i - st + 1);
    }
    return sol;
}

int Find_H(int poz, unsigned int val)
{
    for (int i = 0; i < H[poz].size(); i++) {
        if (H[poz][i].first == val) return H[poz][i].second;
    }
    return 0;
}

void Insert_H(unsigned int x)
{
    int poz = x % MOD;
    if (!Find_H(poz, x)) {
        H[poz].push_back( { x, ++nr } );
    }
}

void Read_Data()
{
    fin >> N >> L >> U;
    for (int i = 1; i <= N; i++) {
        fin >> V[i];
        Insert_H(V[i]);
    }
}