Pagini recente » Cod sursa (job #315430) | Cod sursa (job #1663767) | Cod sursa (job #1649818) | Cod sursa (job #554180) | Cod sursa (job #66246)
Cod sursa(job #66246)
#include<fstream.h>
int n,i,j,v[801];
int outOfBorders,mijBun,stanga,dreapta;
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();
int aux;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
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;
}