Cod sursa(job #1483494)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 9 septembrie 2015 14:40:27
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <vector>
using namespace std;
const char iname[] = "secv5.in";
const char oname[] = "secv5.out";
const int MAXN = 1 << 20;
const int MOD = 246913;

vector<unsigned int> H1[MOD], H2[MOD];
unsigned int a[MAXN], l, u, n;

void read(){
    freopen(iname, "r", stdin);
    scanf("%u %u %u", &n, &l, &u);
    for(int i = 0; i < n; ++i)
        scanf("%u", a+i);
}
long long nrSecv(int lim, vector<unsigned int> H[MOD]){
    long long secv = 0;
    int inc = 0, nrElem = 0;
    for(int i = 0; i < n; ++i){
        int hPos = a[i]%MOD;
        if(H[hPos].size() == 0) H[hPos].push_back(a[i]), ++nrElem;
        else{
            int ok = 1;
            for(int j = 0; j < H[hPos].size(); ++j)
                if(a[i] == H[hPos][j]){
                    ok = 0;
                    break;
                }
            H[hPos].push_back(a[i]);
            if(ok) ++nrElem;
        }

        hPos = a[inc]%MOD;
        while(nrElem > lim){
            int ok = 1;
            for(unsigned int i = 0; i < H[hPos].size(); ++i)
                if(H[hPos][i] == a[inc])
                {
                    H[hPos][i] = H[hPos][H[hPos].size()-1];
                    H[hPos].pop_back();
                    ++inc;
                    --i;
                    ok = 0;
                }
            if(ok)
                --nrElem;
        }
        secv += i - inc;
    }
    return secv;
}
int main()
{
    read();
    long long sec1, sec2;
    sec1 = nrSecv(u, H1);
    sec2 = nrSecv(l-1, H2);
    freopen(oname, "w", stdout);
    printf("%lld", (sec1 - sec2));
    return 0;
}