Cod sursa(job #1764210)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 25 septembrie 2016 11:05:21
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#define mod 666013
#define lim 1000005
unsigned int v[lim],fr[lim],next[lim],lista[mod],n;
void reset(){
    int i;
    for(i=0;i<mod;i++)
        lista[i]=0;
    for(i=0;i<=n;i++){
        fr[i]=0;
        next[i]=0;
    }
}
void adauga(int x,int poz){
    int ind;
    ind=lista[x%mod];
    while(ind!=0&&v[ind]!=x)
        ind=next[ind];
    if(ind!=0)
        fr[ind]++;
    else{
        ind=x%mod;
        fr[poz]=1;
        next[poz]=lista[ind];
        lista[ind]=poz;
    }
}
int query(int x){
    int ind;
    ind=lista[x%mod];
    while(ind!=0&&v[ind]!=x)
        ind=next[ind];
    return fr[ind];
}
void sterge(int x){
    int ind;
    ind=lista[x%mod];
    while(ind!=0&&v[ind]!=x)
        ind=next[ind];
    fr[ind]--;
}
long long secv(int x){
    long long i=1,j=1,cate=0,rasp=0;
    for(i=1;i<=n;i++){
        adauga(v[i],i);
        if(query(v[i])==1)
            cate++;
        while(cate>x){
            if(query(v[j])==1)
                cate--;
            sterge(v[j]);
            j++;
        }
        rasp=rasp+(i-j+1);
    }
    return rasp;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("secv5.in","r");
    fout=fopen("secv5.out","w");
    int i,st,dr;
    long long rasp_st,rasp_dr,rasp;
    fscanf(fin,"%u%u%u",&n,&st,&dr);
    for(i=1;i<=n;i++)
        fscanf(fin,"%u",&v[i]);
    rasp_st=secv(st-1);
    reset();
    rasp_dr=secv(dr);
    rasp=rasp_dr-rasp_st;
    fprintf(fout,"%lld",rasp);
    fclose(fin);
    fclose(fout);
    return 0;
}