Cod sursa(job #1820398)

Utilizator lauratalaatlaura talaat lauratalaat Data 1 decembrie 2016 17:42:04
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include<stdio.h>
#include<vector>
#define MAXN (1<<20)
using namespace std;
#define MOD 666019
struct bine { int nr ; int fr ;};
bine p;
vector<bine>h1[MOD+1],h2[MOD+1];

int v[MAXN+1];

void add1 ( int x ){
    int cx,pp,i;
    cx=x%MOD;
    pp=1;
    for(i=0;i<h1[cx].size()&&pp==1;i++)
        if(h1[cx][i].nr==x)
            pp=0;
    if(pp==0){
        i--;
        h1[cx][i].fr++;
    }
    else{
        p.nr=x;
        p.fr=1;
        h1[cx].push_back(p);
    }
}

void add2 ( int x ){
    int cx,pp,i;
    cx=x%MOD;
    pp=1;
    for(i=0;i<h2[cx].size()&&pp==1;i++)
        if(h2[cx][i].nr==x)
            pp=0;
    if(pp==0){
        i--;
        h2[cx][i].fr++;
    }
    else{
        p.nr=x;
        p.fr=1;
        h2[cx].push_back(p);
    }
}
int check1 ( int x ){
    int cx,pp,i;
    cx=x%MOD;
    pp=1;
    for(i=0;i<h1[cx].size()&&pp==1;i++)
        if(h1[cx][i].nr==x)
            pp=0;
    if(pp==1)
        return 0;
    return 1;
}
int check2 ( int x ){
    int cx,pp,i;
    cx=x%MOD;
    pp=1;
    for(i=0;i<h2[cx].size()&&pp==1;i++)
        if(h2[cx][i].nr==x)
            pp=0;
    if(pp==1)
        return 0;
    return 1;
}
void sterge1 ( int x ){
    int cx,pp=1,i;
    cx=x%MOD;
    for(i=0;i<h1[cx].size()&&pp==1;i++)
        if(h1[cx][i].nr==x)
            pp=0;
    i--;
    h1[cx][i].fr--;
    if(h1[cx][i].fr==0){
        swap(h1[cx][i],h1[cx][h1[cx].size()-1]);
        h1[cx].pop_back();
    }
}
void sterge2 ( int x ){
    int cx,pp=1,i;
    cx=x%MOD;
    for(i=0;i<h2[cx].size()&&pp==1;i++)
        if(h2[cx][i].nr==x)
            pp=0;
    i--;
    h2[cx][i].fr--;
    if(h2[cx][i].fr==0){
        swap(h2[cx][i],h2[cx][h2[cx].size()-1]);
        h2[cx].pop_back();
    }
}
int main(){
    int n,i,x1,x2,lmin,lmax,difmin,difmax;
    long long ans=0;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&x1,&x2);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    lmin=0;lmax=0; difmin=0;difmax=0;
    for(i=1;i<=n;i++){
        while(difmin!=x1 && lmin <n){
            lmin++;
            if(check1(v[lmin])==0)
                difmin++;
            add1(v[lmin]);
        }
        while(difmax<=x2 && lmax <n){
            if(difmax<x2){
                lmax++;
                if(check2(v[lmax])==0)
                    difmax++;
                add2(v[lmax]);
            }
            else{
                if(check2(v[lmax+1])!=0){
                   add2(v[lmax+1]);
                   lmax++;
                }
            }
        }
        if(difmin == x1)
            ans=ans+(lmax-lmin+1);
        sterge1(v[i]);
        if(check1(v[i])==0)
            difmin--;
        sterge2(v[i]);
        if(check2(v[i])==0)
            difmax--;
    }
    printf("%lld\n",ans);
    return 0;
}