Cod sursa(job #1775033)

Utilizator ade_tomiEnache Adelina ade_tomi Data 9 octombrie 2016 18:37:21
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 666013
#define db 0
#define DB 0
#define NMAX (1<<20) + 3 
using namespace std;
class InputReader {
    public:
        InputReader() {}
        InputReader(const char *file_name) {
            input_file = fopen(file_name, "r");
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
        inline InputReader &operator >>(unsigned int &n) {
            while(buffer[cursor] < '0' || buffer[cursor] > '9') {
                advance();
            }
            n = 0;
            while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
                n = n * 10 + buffer[cursor] - '0';
                advance();
            }
            return *this;
        }
    private:
        FILE *input_file;
        static const int SIZE = 1 << 17;
        int cursor;
        char buffer[SIZE];
        inline void advance() {
            ++ cursor;
            if(cursor == SIZE) {
                cursor = 0;
                fread(buffer, SIZE, 1, input_file);
            }
        }
} c ("secv5.in");
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");
    c >> n >> l >> u;
    for (unsigned int i = 1; i <= n; i++)
        c >> v[i];
    cout << solve(u) - solve(l - 1);
    return 0;

 }