Cod sursa(job #49116)

Utilizator alecmanAchim Ioan Alexandru alecman Data 5 aprilie 2007 12:57:05
Problema Numarare triunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
/*
 *
 *
  infoarena 2.0 - Arhiva - Numarare Triunghiuri
 *
 *
 */

#include<stdio.h>
#include<math.h>

#define INPUT "nrtri.in"
#define OUTPUT "nrtri.out"

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

int n,a[801];

void citire();
void quick(int, int);
void rezolvare();
int cauta(int, int);

int main()
{
  citire();
  quick(1,n);
  rezolvare();
  fclose(fin);
  fclose(fout);
  return 0;
}

void citire()
{
  fscanf(fin, "%d", &n);
  for(int i=1;i<=n;++i)
    fscanf(fin, "%d", &a[i]);
}

void quick(int st, int dr)
{
  int l=st,m=dr;
  while(l!=m)
  {
    if((l<m&&a[l]>a[m])||(l>m&&a[l]<a[m]))
    {
      a[l]=a[l]+a[m];
      a[m]=a[l]-a[m];
      a[l]=a[l]-a[m];
      l=l+m;
      m=l-m;
      l=l-m;
      if(l<m)
        --m;
      else
        ++m;
    }
    else
      if(l<m)
        --m;
      else
        ++m;
  }
  if(l!=st) quick(st,l-1);
  if(l!=dr) quick(l+1,dr);
}

void rezolvare()
{
  int poz;
  long total=0;
  for(int i=1;i<=n;++i)
    for(int j=i+1;j<=n;++j)
    {
      poz=cauta(i,j);
      total+=(poz-j);
    }
  fprintf(fout, "%ld\n", total);
}

int cauta(int st, int dr)
{
  int pozinc,pozsf,pozmij;
  pozinc=1;
  pozsf=n;
  pozmij=(pozinc+pozsf+1)/2;
  while(pozinc<pozsf)
  {
    if(a[st]+a[dr]<a[pozmij])
    {
      pozsf=pozmij-1;
      pozmij=(pozinc+pozsf+1)/2;
    }
    else
    {
      pozinc=pozmij;
      pozmij=(pozinc+pozsf+1)/2;
    }
  }
  return pozmij;
}