Cod sursa(job #1568504)

Utilizator CristinaMCristina Mihailescu CristinaM Data 14 ianuarie 2016 12:53:32
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("nrtri.in");
ofstream g("nrtri.out");
int n, v[30001], S, m, gasit;
void caut(int s, int d)
{
    if(s>d) return;
    m=(s+d)/2;
    if(v[m]<S && (m==n || v[m+1]>=S)) gasit=1;
    else
    {
        if(v[m]>=S) caut(s,m-1);
        else caut(m+1,d);
    }
}

void QUICKSORT(int inf, int sup)
{
    int x, i, j, t;
    i=inf;
    j=sup;
    x=v[(i+j)/2];
    do
    {
        while((i<sup)&&(v[i]<x)) i++;
        while((j>inf)&&(v[j]>x)) j--;
        if(i<=j)
        {
            t=v[i];
            v[i]=v[j];
            v[j]=t;
            i++;
            j--;
        }
    }
    while(i<=j);
    if(inf< j) QUICKSORT(inf,j);
    if(i<sup) QUICKSORT(i,sup);
}

int main()
{
    int i,j,y=0;
    f>>n;
    for(i=1; i<=n; i++) f>>v[i];
    QUICKSORT(1,n);
    for(i=1; i<=n-2; i++)
        for(j=i+1; j<=n-1; j++)
        {
            S=v[i]+v[j];
            if(S>v[n]) {y=y+n-j; continue;}
            if(S>v[j+1])
            {
                gasit=0;
                caut(j+1,n);
                if(gasit==1) y=y+m-j;
            }
        }
    g<<y;
    return 0;
}