Cod sursa(job #1291487)

Utilizator YusukeFMI Mares Medar Razvan Yusuke Data 12 decembrie 2014 21:16:28
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.51 kb
#include<fstream>
#include<cstring>
#include<algorithm>
#define maxh 666013
#define nmax 1<<21
using namespace std;
 ifstream f("secv6.in");
 ofstream g("secv6.out");
struct nod {unsigned long int inf,x; nod *urm;} *l[maxh + 10];
unsigned long int n,U,L,x,nr,i,v[nmax],viz[nmax],a[nmax];
long long sol,A,B;
void add(unsigned long int y,unsigned long int x){
    nod *p=new nod;
    nr++;
    p->x=nr;
    p->inf=x;
    p->urm=l[y];
    l[y]=p;
    v[i]=nr;
}

void cauta(unsigned long int y,unsigned long int x){
    nod *p;
    for(p=l[y];p!=NULL;p=p->urm)
        if(p->inf==x)
            v[i]=p->x;
    add(y,x);
}
long long lung(unsigned long int X){
    if(X == 0)
        return 0;
    unsigned long int dis=1,p=1;
    long long rez=0;
    a[1]=1;
    viz[v[1]]=1;
    for(i=2;i<=n;i++){
        if(viz[v[i]]){
            viz[v[i]]++;
            a[i]=p;
        }
        else{
            viz[v[i]]++;
            dis++;
            if(dis>X){
                while(dis > X){
                    viz[v[p]]--;
                    if(viz[v[p]] == 0)
                        dis--;
                p++;
                }
            }
    a[i]=p;
    }
}
    for(i=1;i<=n;i++)
        rez+=(long long)i - (long long)a[i] + (long long)1;
    memset(viz,0,sizeof(viz));
    return rez;
}
int main(){
    f>>n>>L>>U;
    for(i=1;i<=n;i++){
        f>>x;
        cauta(x%maxh,x);
    }
    A=(long long)lung(U);
    B=(long long)lung(L-1);
    sol=A - B;
    g<<sol;
}