Cod sursa(job #1775015)

Utilizator ade_tomiEnache Adelina ade_tomi Data 9 octombrie 2016 18:23:08
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 666013
#define db 0
#define DB 0
#define NMAX (1<<20) + 3 
using namespace std;
unsigned int l, u, n, v[NMAX];
vector <unsigned int> h[MOD + 1], count[MOD + 1];
void add (unsigned int x, unsigned int val)
{
    if (db)
    {
        cout << "am adaugat " << x << endl;
    }
    unsigned int r = x % MOD;
    for (unsigned int i = 0; i < h[r].size(); i++)
    {
        if (h[r][i] == x)
        {
            count[r][i] += val;
            return;
        }
    }
    h[r].push_back(x);
    count[r].push_back(1);
}
unsigned int f (unsigned int x)
{
    unsigned int r = x % MOD;
    for (unsigned int i = 0; i < h[r].size(); i++)
    {
        if (h[r][i] == x)
            return count[r][i];
    }
    return 0;
}
long long solve (unsigned int k)
{
    if (db)
        cout << "here" << endl;
    unsigned int inter = 0, i1 = 1;
    long long sol = 0;
    for (unsigned int i = 1; i <= n; i++)
    {
       
        if (f(v[i]) == 0)
            inter++;
       
       if (DB)
            cout << inter  << " "<< v[i] <<endl;
         add (v[i], 1);
         while (inter > k)
         {
             if(db == 1)
                cout << "here" << endl;
             add (v[i1], -1);
             if (f(v[i1]) == 0)
                 inter--;
             i1++;
             
         }
         if (db)
             cout << "WTF" << endl;
         sol += (long long)(i - i1 + 1);
    }
    for (unsigned int i = 0; i <= MOD; i++)
    {
        h[i].clear();
        count[i].clear();
    }
    return sol;
}
int main()
{
    ifstream cin ("secv5.in");
    ofstream cout ("secv5.out");
    cin >> n >> l >> u;
    for (unsigned int i = 1; i <= n; i++)
        cin >> v[i];
    cout << solve(u) - solve(l - 1);
    return 0;

 }