Cod sursa(job #273742)

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

using namespace std;

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

void baga(int S,int poz1,int 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(int S,int poz1,int poz2)
{
     S=S%lg_max;
     for(nod *q=sir[S];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()
{
     int unde=lg_max;
     if (unde>L)
          unde=L;
     for (int 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 ("%d %d",&n,&L);
     for (int i=0;i<n;i++)
     {
          scanf("%d",&si[i]);
          sir[i]=NULL;
     }
     for (int i=0;i<n;i++)
          for (int 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("%d\n",rezultat/3);
     return 0;
}