Cod sursa(job #88965)

Utilizator BloodRainBurceanu Gabriel BloodRain Data 4 octombrie 2007 23:41:14
Problema Numarare triunghiuri Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<fstream.h>
int n,i,j,v[801];
int outOfBorders,mijBun,stanga,dreapta;

int q_sort(int a[], int l,int r)
{  int i,j;   
	 i=l;    j=r;          

  int ref,temp;
    ref=a[(l+r)/2];
    do {
  while(a[i]<ref&& i<r)
  i++;
  while(ref<a[j]&& j>l)
  j--;
  if(i<=j)
   {  temp=a[i];
       a[i]=a[j];
       a[j]=temp;
       i++;
       j--;           }
          } while (i<=j);
  if (l<j) q_sort(a,l,j);
  if (i<r) q_sort(a,i,r);
  return 0;         }



int merge(int a,int b, int c)
	{
	if(a+b<c) return -1;//tre sa caut la stanga
	if(a+c<b||c+b<a) return -2; // tre sa caut la dreapta
	return 1;
	}
int cauta(int directie)
	{
	int st,dr,mij;
	st=1;
	dr=n;
	while(st<=dr)
		{
		mij=(st+dr)/2;
		outOfBorders=((mij+directie>n)||(mij+directie<1));
		mijBun=merge(v[i],v[j],v[mij]);
		if(mijBun==1)
		       {
		       if(outOfBorders)
					return mij;
		       if(merge(v[i],v[j],v[mij+directie])!=1)
					return mij;
		       if(directie==1) st=mij+1;
		       else dr=mij-1;
		       }
		//else if(outOfBorders) return -1;
		else if(mijBun==-1) dr=mij-1;
		else st=mij+1;//if(mijBun==-2)
		}
	return 0;
	}
int intre(int poz)
	{
	if(poz>=stanga&&poz<=dreapta) return 1;
	return 0;
	}
int main()
{
ofstream out("nrtri.out");
int cnt=0,x,tzi;
ifstream in("nrtri.in");
in>>n;
for(i=1;i<=n;i++)
	in>>v[i];
in.close();




q_sort(v,1,n);

int iIntre,jIntre;
for(i=1;i<n;i++)
	for(j=i+1;j<=n;j++)
		{
		stanga=cauta(-1);
		dreapta=cauta(1);
		if(stanga!=-1)//sau dreapta ca tot aia e(adica nu a gasit nici un numar care sa mearga)
			{
			iIntre=intre(i);
			jIntre=intre(j);

			if(iIntre) cnt--;
			if(jIntre) cnt--;
			cnt+=dreapta-stanga+1;
			}
		}

out<<cnt/3<<'\n';
out.close();
return 0;
}