Cod sursa(job #2141288)

Utilizator DavidDragulinDragulin David DavidDragulin Data 24 februarie 2018 11:41:38
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<string>
#define M 666013
#define DIM (1 << 20) + 1
using namespace std;

unsigned int n,l,u,norm,a[DIM],st,dr;
vector<vector<unsigned int> > G;
vector<pair<unsigned int, unsigned int> > b;

vector<short int> f;

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

unsigned long long secv(unsigned int dim) {

    f.clear();
    f.resize(norm+1, 0);

    if (!dim) return 0;

    unsigned long long sol=0, nr=0;

    G.clear(); G.resize(M);

    for(st = 1, dr = 1; dr <= n; ++dr) {

        if(!f[a[dr]])
            nr++;

        f[a[dr]]++;

        while(nr > dim) {

            if (!(--f[a[st]]))
                nr--;
            st++;
        }
        sol += dr - st + 1;
    }
    return sol;
}

int main() {
    unsigned int x,i,j;
    char s[30];

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

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

        in.getline(s,30);
        x = 0;
        for(j = 0; s[j]!=0; ++j)
            x = x * 10 + s[j] - '0';

        b.push_back(make_pair(x, i));
    }

    sort(b.begin(), b.end());

    for(i = 0; i < b.size(); ++i)
        if (!i || b[i].first != b[i-1].first)
                a[b[i].second] = ++norm;
        else
                a[b[i].second] = norm;

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

    return 0;
}