Cod sursa(job #1238199)

Utilizator livliviLivia Magureanu livlivi Data 5 octombrie 2014 22:27:40
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<cstdio>
#define R 666019
using namespace std;
int lst[2][R+1];
unsigned int v[1000002];
int urm[2][1000002];
int m[2];
int cnt[2][1000002];
int k[2];
int rez;
int cauta(unsigned int x,int unde){
    int tip=x%R,p;
    p=lst[unde][tip];
    while(p!=0){
        if (v[p]==x) return p;
        p=urm[unde][p];
    }
    return -1;
}
void adauga(unsigned int x,int unde){
    int tip=x%R,p;
    p=cauta(x,unde);
    if (p!=-1){
        cnt[unde][p]++;
        return ;
    }
    urm[unde][m[unde]]=lst[unde][tip];
    lst[unde][tip]=m[unde];
    cnt[unde][m[unde]]=1;
    k[unde]++;
}
void sterge(unsigned int x,int unde){
    int tip=x%R,p;
    p=lst[unde][tip];
    if (v[p]==x){
        cnt[unde][p]--;
        if (cnt[unde][p]==0){
            lst[unde][tip]=urm[unde][p];
            k[unde]--;
        }
    }
    while(urm[unde][p]!=0 &&v[urm[unde][p]]!=x){
        p=urm[unde][p];
    }
    if (v[urm[unde][p]]==x){
        cnt[unde][urm[unde][p]]--;
        if (cnt[unde][urm[unde][p]]==0){
            urm[unde][p]=urm[unde][urm[unde][p]];
            k[unde]--;
        }
    }
}

int main(){
    freopen ("secv5.in","r",stdin);
    freopen ("secv5.out","w",stdout);
    int n,l,u,i,p1,p2,o;
    unsigned int ma=0;
    scanf ("%d%d%d",&n,&l,&u);
    for(i=1;i<=n;i++){
        scanf ("%d",&v[i]);
        if (ma<v[i]) ma=v[i];
    }
    m[0]=1;
    m[1]=1;
    p1=1;
    p2=1;
    v[n+1]=ma+1;
    while(1!=0){
        while(k[0]<l &&m[0]<=n){
            adauga(v[m[0]],0);
            m[0]++;
        }
        if (k[0]<l) {
            printf ("%d\n",rez);
            return 0;
        }
        while(k[1]<=u &&m[1]<=n+1){
            adauga(v[m[1]],1);
            m[1]++;
        }
        o=k[0];
        while(k[0]==o){
            sterge(v[p2],0);
            sterge(v[p2],1);
            p2++;
        }
        rez=rez+(m[1]-m[0])*(p2-p1);
        p1=p2;
    }
    return 0;
}