Đầu tiên xin cảm ơn mọi người đã xem qua bài của mình, mình làm bài tập bị lỗi mà không biết sai chỗ nào nên mong mọi người xem và tìm lý do sai giúp mình.

**Lưu ý: Bài này mình dùng cày trâu được rồi, mình nhờ mọi người phần chặt nhị phân**

.................................................. .................................................. .........................
Đề bài:

Bài 5: Đếm tam giác
Cho 3 dãy số dương A, B, C cùng có N phần tử. Hãy đếm xem có bao nhiêu bộ3 sốA[i], B[j] và C[k] mà 3 số này là 3 cạnh của 1 tam giác.

Dữ liệu vào: từ file TRIANGLE.INP với cấu trúc:

- Dòng đầu chứa số nguyên dương N (N≤1000)

- Dòng thứ hai chứa các số A1, A2, ..., AN.

- Dòng thứ ba chứa các số B1, B2, ..., BN.

- Dòng thứ tư chứa các số C1, C2, ..., CN.

Các số Ai, Bi, Ci đều không vượt quá 109 và được ghi cách nhau bởi dấu cách.

Kết quả: file văn bản TRIANGLE.OUT gồm một sốS duy nhất là sốlượng bộba sốtìm

được.
Input Output
2[br]2 3[br]3 1[br] 4 7 2
3[br]2 3 1[br]4 4 9[br]8 5 2 8

.................................................. .................................................. .........................
Mình đã cố giải nhưng không thành công:

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>

using namespace std;

long long n,i,j,first,final,l,r,m,ans=0;
long long a[100000],b[100000],c[100000];

long long cnp(long long x)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>x) r=m-1;
else l=m+1;
}
return l;
}

long long tknp(long long y)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>y) r=m-1;
else l=m+1;
}
return l;
}

int main()
{
scanf("%lld",&n);
for (i=1;i<=n;i++) scanf("%lld",&a[i]);
for (i=1;i<=n;i++) scanf("%lld",&b[i]);
for (i=1;i<=n;i++) scanf("%lld",&c[i]);
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (abs(a[i]-b[j])<c[n])
if (a[i]+b[j]>c[1])
{
first=cnp(abs(a[i]-b[j]));
final=tknp(a[i]+b[j]);
}
if (final>=first) ans=ans+final-first+1;
printf("%lld %lld\n",first,final);
}
printf("%lld",ans);
}
.................................................. .................................