Pagini recente » Cod sursa (job #1441580) | Cod sursa (job #2603356) | Cod sursa (job #2145156) | Cod sursa (job #2097622) | Cod sursa (job #1522055)
#include<fstream>
#include<algorithm>
#include<iostream>
using namespace std;
int v[1000];
int n;
int binary(int st, int dr, int x, int i, int j) {
int mid = (st+dr) / 2;
if(x == v[mid]) {
if(mid == i || mid == j) return -1;
return mid;
}
if(st >= dr) return -1;
if(v[mid] > x)
return binary(st, mid-1, x, i, j);
else
return binary(mid+1, dr, x, i, j);
}
int main(void) {
ifstream fin("nrtri.in");
ofstream fout("nrtri.out");
fin >> n;
for(int i = 0; i < n; i++)
fin >> v[i];
sort(v, v + n);
int nr = 0;
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++) {
int max1 = v[i] + v[j];
int min1 = v[j] > v[i] ? v[j] - v[i] : v[i] - v[j];
int k = min1-1;
do {
k++;
min1 = binary(0, n-1, k, i , j);
} while(k < max1 && min1 == -1);
if(min1 < 0) continue;
k = max1+1;
do {
k--;
max1 = binary(0, n-1, k, i , j);
} while(k > v[min1] && max1 == -1);
if(max1 < 0) continue;
//cout << v[i] << " " << v[j] << " " << v[min1] << " " << v[max1] << endl;
nr += max1 - min1 + 1;
if(i >= min1 && i <= max1) nr--;
if(j >= min1 && j <= max1) nr--;
}
fout << nr / 3;
}