Cod sursa(job #247854)

Utilizator katakunaCazacu Alexandru katakuna Data 24 ianuarie 2009 12:50:31
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxh 666013
#define nmax 1<<21
using namespace std;

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(){

FILE *f=fopen("secv5.in","r");
fscanf(f,"%lu %lu %lu",&n,&L,&U);
  for(i=1;i<=n;i++){
  fscanf(f,"%lu",&x);
  cauta(x%maxh,x);
  }

fclose(f);

A=(long long)lung(U);
B=(long long)lung(L-1);
sol=A - B;

FILE *g=fopen("secv5.out","w");
fprintf(g,"%lld",sol);
fclose(g);

return 0;
}