Cod sursa(job #273748)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 8 martie 2009 22:52:04
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#define lg_max 600013

using namespace std;

struct nod
{
     long inf,p1,p2,viz;
     nod *next;
     nod ()
     {
          viz=0;
     }
}*sir[lg_max];
long rezultat,si[lg_max],n,L;

void baga(long S,long poz1,long poz2)
{
     nod *q=new nod;
     q->inf=S;
     q->p1=poz1;
     q->p2=poz2;
     q->next=sir[S%lg_max];
     sir[S%lg_max]=q;
}

void cauta(long S,long poz1,long poz2)
{
     for(nod *q=sir[S%lg_max];q;q=q->next)
          if (q->inf==S)
          {
               if ((q->p1!=poz1 && q->p2!=poz2) && (q->p2!=poz1 && q->p1!=poz2))
               {
                         rezultat++;
                         q->viz++;
               }
          }
}

void solve()
{
     long unde=lg_max-1;
     if (unde>L)
          unde=L;
     for (long i=0;i<unde;i++)
     {
          for (nod *q=sir[i];q;q=q->next)
          {
               rezultat-=q->viz;
               cauta(L-q->inf,q->p1,q->p2);
          }
     }
}

void citire ()
{
     scanf ("%ld %ld",&n,&L);
     for (long i=0;i<n;i++)
     {
          scanf("%ld",&si[i]);
          sir[i]=NULL;
     }
     for (long i=0;i<n;i++)
          for (long j=i+1;j<n;j++)
               baga(si[i]+si[j],i,j);
}

int main ()
{
     freopen ("oite.in","r",stdin);
     freopen ("oite.out","w",stdout);
     citire();
     solve();
     printf("%ld\n",rezultat/3);
     return 0;
}