Pagini recente » Cod sursa (job #1817053) | Cod sursa (job #2169996) | Cod sursa (job #1729194) | Cod sursa (job #1379412) | Cod sursa (job #1766584)
#include <stdio.h>
#include <stdlib.h>
#define MOD 2000000
int v[1025],next[1025*1025],lista[2000000],cdr[1025*1025],s[1025*1025],n;
void adauga(int x,int k)
{
int p;
if(lista[x%MOD]==0)
{
n++;
s[n]=x;
next[n]=0;
lista[x%MOD]=n;
cdr[n]=k;
}
else
{
p=lista[x%MOD];
if(s[p]>=x)
{
if(s[p]==x)
{
if(cdr[p]>=k)
{
n++;
lista[x%MOD]=n;
next[n]=p;
s[n]=x;
cdr[n]=k;
}
else
{
while(next[p]!=0 && s[next[p]]==x && cdr[next[p]]<k)
p=next[p];
n++;
next[n]=next[p];
next[p]=n;
s[n]=x;
cdr[n]=k;
}
}
else
{
n++;
lista[x%MOD]=n;
next[n]=p;
s[n]=x;
cdr[n]=k;
}
}
else
{
while(next[p]!=0 && s[next[p]]<x) p=next[p];
if(s[next[p]]==x)
{
while(next[p]!=0 && s[next[p]]==x && cdr[next[p]]<k)
p=next[p];
n++;
next[n]=next[p];
next[p]=n;
s[n]=x;
cdr[n]=k;
}
else
{
n++;
next[n]=next[p];
next[p]=n;
s[n]=x;
cdr[n]=k;
}
}
}
}
int cauta(int x,int k)
{
int p=lista[x%MOD];
if(s[p]>=x)
if(s[p]==x)
{
int nr=0;
while(next[p]!=0 && s[p]==x && cdr[p]<k)
{
p=next[p];
nr++;
}
if(s[p]==x && cdr[p]<k)
nr++;
return nr;
}
else
return 0;
else{
while(next[p]!=0 && s[next[p]]<x) p=next[p];
if(s[next[p]]==x)
{
int nr=0;
p=next[p];
if(next[p]!=0 && s[p]==x && cdr[p]<k)
{
p=next[p];
nr++;
}
if(s[p]==x && cdr[p]<k)
nr++;
return nr;
}
else
return 0;
}
}
int main()
{
int c,l,i,j;
long long nr;
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
scanf("%d%d",&c,&l);
for(i=1; i<=c; i++)
scanf("%d",&v[i]);
for(i=1; i<=c-3; i++)
for(j=i+1; j<=c-2; j++)
if(v[i]+v[j]<=l)
adauga(v[i]+v[j],j);
nr=0;
for(i=3; i<=c-1; i++)
for(j=i+1; j<=c; j++)
nr+=cauta(l-v[i]-v[j],i);
printf("%lld\n",nr);
return 0;
}