Cod sursa(job #629654)

Utilizator George25Raduta George Cristian George25 Data 3 noiembrie 2011 17:30:45
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

int i,n,poz,sum,j,k,nr;
typedef struct{
	int x;
	int y;
}nrtri;
nrtri a[801];

inline bool cmp (const nrtri &a, const nrtri &b)
{
    if (a.x==b.x) return a.y>b.y;
        else return a.x<b.x;
}

inline void cb(int x,int xx){
	int st,dr,mij;
	st=xx+1;
	dr=n;
	mij=(st+dr)/2;
	while (st<=dr){
		if (a[mij].x>x){
			dr=mij-1;
			mij=(st+dr)/2;
		}
		if (a[mij].x==x){
			poz=mij;
			break;
		}
		if (a[mij].x<x){
			poz=mij;
			st+=2;
			mij=(st+dr)/2;
		}
	}
}

int main(){
	freopen("nrtri.in","r",stdin);
	freopen("nrtri.out","w",stdout);
	scanf("%d",&n);
	for (i=1; i<=n; ++i)
	{
		scanf("%d",&a[i].x);
		a[i].y=i;
	}
	sort(a+1,a+n+1,cmp);
	for (i=1; i<=n-2; ++i)
	{
		for (j=i+1; j<=n-1; ++j)
		{
			sum=a[i].x+a[j].x;
			cb(sum,j);
			for (k=j+1; k<=poz; k++)
				if (a[i].x+a[j].x>=a[k].x && a[i].x+a[k].x>=a[j].x && a[k].x+a[j].x>=a[i].x) 
					{
						nr++;
						//printf("%d %d %d\n",a[i].y,a[j].y,a[k].y);
				}
		}
	}		
	printf("%d\n",nr);
	return(0);
}