Cod sursa(job #1856375)

Utilizator vazanIonescu Victor Razvan vazan Data 24 ianuarie 2017 19:57:24
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<algorithm>
using namespace std;

const int NMAX = 1100000;

bool cmp(long long *a, long long *b){
    if(*a < *b)
        return 1;
    return 0;
}
long long n, l, u, v[NMAX], *poz[NMAX];
int hs1[NMAX], hs2[NMAX];

int main(){
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin >> n >> l >> u;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
        poz[i] = &v[i];
    }
    poz[n + 1] = &v[0];
    sort(poz + 1, poz + n + 1, cmp);
    int last = *poz[1], crnt = 1;
    *poz[1] = crnt;
    for(int i = 2; i <= n; i++){
        if(*poz[i] != last){
            crnt++;
            last = *poz[i];
        }
        *poz[i] = crnt;
    }
    int st1, st2, dr, cnt1 = 0, cnt2 = 0; //st1 for l, st2 for u
    long long qqq = 0;
    for(st1 = 1, st2 = 1, dr = 1; dr <= n; dr++){
        if(hs1[v[dr]] == 0)
            cnt1++;
        hs1[v[dr]]++;
        while(cnt1 >= l && st1 <= dr){
            if(hs1[v[st1]] == 1){
                cnt1--;
            }
            hs1[v[st1]]--;
            st1++;
        }
        ////////
        if(hs2[v[dr]] == 0)
            cnt2++;
        hs2[v[dr]]++;
        while(cnt2 > u && st2 <= dr){
            if(hs2[v[st2]] == 1){
                cnt2--;
            }
            hs2[v[st2]]--;
            st2++;
        }
        ////
        if(cnt2 >= l)
            qqq += st1 - st2;
    }
    fout << qqq;
    return 0;
}