Cod sursa(job #1765820)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 27 septembrie 2016 00:17:22
Problema Oite Scor 100
Compilator c Status done
Runda cerculdeinfo-lectia1-hashuri.rabinkarp Marime 1.47 kb
#include <stdio.h>
#define MOD 702113
#define MAX_N 524801
int v[1024],hash[MOD],n;
struct nod
{
    int x,y,val,next;
}list[MAX_N];
void myqsort(int start,int stop)
{
    int i,j,pivot,aux;
    i=start;j=stop;
    pivot=v[(i+j)/2];
    while(i<=j)
    {
        while(v[i]<pivot)
            i++;
        while(v[j]>pivot)
            j--;
        if(i<=j)
        {
            aux=v[i];
            v[i]=v[j];
            v[j]=aux;
            i++;j--;
        }
    }
    if(j>start)
        myqsort(start,j);
    if(i<stop)
        myqsort(i,stop);
}
inline void add(int x,int i,int j)
{
    list[++n].val=x;
    list[n].x=i;list[n].y=j;
    list[n].next=hash[x%MOD];
    hash[x%MOD]=n;
}
inline long long verif(int x,int j)
{
    long long co=0;
    int p=hash[x%MOD];
    while(p)
    {
        if(list[p].val==x && list[p].x>j && list[p].y>j)
            co++;
        p=list[p].next;
    }
    return co;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("oite.in","r");
    fout=fopen("oite.out","w");
    int c,l,i,j;
    long long co=0;
    fscanf(fin,"%d%d",&c,&l);
    for(i=0;i<c;i++)
        fscanf(fin,"%d",&v[i]);
    myqsort(0,c-1);
    for(i=0;i<c-1;i++)
        for(j=i+1;j<c;j++)
            add(v[i]+v[j],i,j);
    for(i=0;i<c-1;i++)
        for(j=i+1;j<c;j++)
            if(v[i]+v[j]<l)
                co+=verif(l-v[i]-v[j],j);
    fprintf(fout,"%lld",co);
    fclose(fin);
    fclose(fout);
    return 0;
}