Cod sursa(job #48791)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 5 aprilie 2007 02:51:37
Problema Oite Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
using namespace std;
#include<stdio.h>
#include<vector>

#define NMAX 1024
#define LMAX 2007679

typedef struct t_v
{
	int x, y;
};
void read();
void solve();
void add(int x, int y);
void rem(int x, int y);
int find(int val);

int N, A[NMAX], L;
vector<t_v> V[LMAX];

int main()
{
	freopen("oite.in", "r", stdin);
     freopen("oite.out", "w", stdout);

     read();
     solve();
	return 0;
}

void read()
{
	scanf("%d%d", &N, &L);

     for(int i = 0; i < N; i++)
     scanf("%d", A + i);
}

void solve()
{
	int i, j, rez = 0;

     for(i = N - 1; i >= 2; i--)
     for(j = i - 1; j >= 1; j--)
     add(i, j);

     for(i = 1; i < N - 2; i++)
     {
     	for(j = i + 1; j < N; j++)
          rem(i, j);
          for(j = i - 1; j >= 0; j--)
          rez += find(L - A[i] - A[j]);
     }
     printf("%d\n", rez);
}

void add(int x, int y)
{
	int i;

     for(i = 0; i < V[(A[x] + A[y]) % LMAX].size(); i++)
     if(V[(A[x] + A[y]) % LMAX][i].x == A[x] + A[y])
     break;

     if(i == V[(A[x] + A[y]) % LMAX].size())
     {
     t_v sp;
     sp.x = A[x] + A[y], sp.y = 1;
     V[(A[x] + A[y]) % LMAX].push_back(sp);
     }
     else
     V[(A[x] + A[y]) % LMAX][i].y++;
}

void rem(int x, int y)
{
	int i;

     for(i = 0; i < V[(A[x] + A[y]) % LMAX].size(); i++)
     if(V[(A[x] + A[y]) % LMAX][i].x == A[x] + A[y])
     V[(A[x] + A[y]) % LMAX][i].y--;
}

int find(int val)
{
	int i;

     if(val < 0) return 0;
     
     for(i = 0; i < V[val % LMAX].size(); i++)
     if(V[val % LMAX][i].x == val)
     return V[val % LMAX][i].y;
     return 0;
}