Cod sursa(job #2583838)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 18 martie 2020 14:50:00
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;

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

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

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

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

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

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

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