Cod sursa(job #1574472)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 20 ianuarie 2016 16:48:28
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<fstream>
#include<unordered_map>
using namespace std;

const unsigned int N = 1000100;
const unsigned int MOD = 106013;

unsigned int n, l, u, no, norm[N], x[N];
char s[30];
unordered_map<unsigned int, int> H;

long long secv(int m) {
    H.clear();

    long long sol = 0;
    int lg = 0, dist = 0, pos = 1;

    for (int i = 1; i <= n; ++i) {

        if (H[x[i]]) {
            ++H[x[i]];
            ++lg;
            sol += 1LL * lg;
        }
        else {

            ++H[x[i]];
            ++dist;
            ++lg;

            if (dist > m) {
                while (dist > m) {
                    --H[x[pos]];
                    if (!H[x[pos]]) {
                        --dist;
                        H.erase(x[pos]);
                    }

                    --lg;
                    ++pos;
                }
            }

            sol += 1LL * lg;
        }
    }

    return sol;
}

bool cmp(unsigned int a, unsigned int b) {
    return x[a] < x[b];
}

ifstream in("secv5.in");
ofstream out("secv5.out");

int main() {
    unsigned int i;



    in >> n >> l >> u;
    in.get();

    for(i = 1; i <= n; ++i) {

        in.getline(s, 1000);

        unsigned int pp = 0, r = 0;
        while(s[pp] >= '0' && s[pp] <= '9')
            r = r * 10 + s[pp++] - '0';

        x[i] = r;
    }

    out << secv(u) - secv(l-1)  << '\n';

    return 0;
}