Cod sursa(job #2581868)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 15 martie 2020 21:40:28
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;

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

const int N = (1 << 20);
const int K = 666019;

int v[N];
int nr;
int val[N], urm[N], f[N], lst[K];

int apartine(int x){
    int c = x % K;
    for(int p=lst[c]; p!=0; p=urm[p])
        if(val[p] == x)
            return p;
    return -1;
}

int dif1, dif2;

void adauga(int x){
    int poz = apartine(x);
    if(poz != -1){
        f[poz]++;
        return;
    }
    dif1++, dif2++;
    int c = x % K;
    val[++nr] = x;
    urm[nr] = lst[c];
    f[nr] = 1;
    lst[c] = nr;
}

bool sterge(int x){
    int poz = apartine(x);
    f[poz]--;
    if(f[poz] > 0)
        return false;
    int c = x % K;
    int p = lst[c];
    if(val[p] == x)
        lst[c] = urm[p];
    else{
        while(urm[p] != 0 && val[urm[p]] != x)
            p = urm[p];
        if(urm[p] != 0)
            urm[p] = urm[urm[p]];
    }
    return true;
}

int main()
{
    int n,l,u,i,ans,j1,j2;
    bool deleted;
    fin >> n >> l >> u;
    j1 = j2 = 0;
    ans = 0;
    for(i=0; i<n; i++){
        fin >> v[i];
        adauga(v[i]);
        while(dif2 > l-1){
            deleted = sterge(v[j2]);
            dif2 -= (int)deleted;
            j2++;
        }
        while(dif1 > u){
            deleted = sterge(v[j1]);
            dif1 -= (int)deleted;
            j1++;
        }
        ans += (j2 - j1);
    }
    fout << ans << "\n";
    return 0;
}