Cod sursa(job #1291495)

Utilizator YusukeFMI Mares Medar Razvan Yusuke Data 12 decembrie 2014 21:19:25
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.33 kb
#include<fstream>
#include<cstring>
#include<algorithm>
#define maxh 666013
#define nmax 1<<21
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.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;
    return ;
    }
  }

add(y,x);
return ;
}

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;
}