Cod sursa(job #578864)

Utilizator halianStefanca Stefan halian Data 11 aprilie 2011 17:58:14
Problema Medie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>

struct sir1
{int val,poz;} sir[9000];
int n,s1[181],s1L;
long rez;

void schSir(sir1 &a,sir1 &b) {sir1 aux=a;a=b;b=aux;}

void qsortSir(int li,int ls)
{
	if(li>=ls) return;
	int i=li,j;
	for(j=li+1;j<=ls;j++)
		if(sir[j].val<sir[li].val)
			schSir(sir[++i],sir[j]);
	schSir(sir[i],sir[li]);
	qsortSir(li,i-1);
	qsortSir(i+1,ls);
}

void cit(FILE *f)
{
	int i;
	fscanf(f,"%i",&n);
	for(i=0;i<n;i++)
	{
		fscanf(f,"%i",&sir[i].val);
		sir[i].poz=i;
	}
}

void map()
{
	int a;
	for(s1L=1;(a=s1L*50)<n;s1L++)
		s1[s1L++]=sir[a].val;
	s1[s1L]=sir[n-1].val;
}

void caut(int val,int poz1,int poz2)
{
	int i,pos;
	for(i=0;i<s1L;i++)
		if(val>=s1[i] && val<=s1[i+1])
		{
			pos=i;
			i=200;
		}
	for(i=pos*50;val>sir[i].val;i++);
	for(;val==sir[i].val;i++)
		if(sir[i].poz>poz1 && sir[i].poz!=poz2)
			rez++;
}

void cautMar()
{
	int i,j,a;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			if(sir[i].poz!=sir[j].poz)
			{
				a=2*sir[i].val-sir[j].val;
				if(a<=0)
					j=n;
				else
					caut(a,sir[j].poz,sir[i].poz);
			}
}

void scr(FILE *f)
{
	fprintf(f,"%li\n",rez);
}

int main()
{
	cit(fopen("medie.in","r"));
	qsortSir(0,n-1);
	map();
	cautMar();
	scr(fopen("medie.out","w"));
	return 0;
}