Cod sursa(job #1253277)

Utilizator costyv87Vlad Costin costyv87 Data 1 noiembrie 2014 00:10:17
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <vector>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#define mp make_pair
#define X first
#define Y second
#define nn 410
#define nm 100100
using namespace std;

double er = 0.000000001;
FILE *f,*g;
vector <pair<double,double> > v;
double l[nm];
int k[nm];
double r[nn];
int n,m,nr;
double res;


void read()
{
    double ax,ay;
    int i;

    f=fopen("sea.in","r");
    g=fopen("sea.out","w");

    fscanf(f,"%d%d",&n,&m);

    for (i=1;i<=n;i++)
    {
        fscanf(f,"%lf%lf",&ax,&ay);
        v.push_back(mp(ax,ay));
    }

    for (i=1;i<=m;i++)
        fscanf(f,"%lf%d",&l[i],&k[i]);
}

inline double euclid(pair<double,double> a, double b)
{
    return ( sqrt( (a.X-b)*(a.X-b) + a.Y*a.Y ) );
}

inline double dist(pair<double,double> a, double b)
{
    return (  (a.X-b)*(a.X-b) + a.Y*a.Y ) ;
}

int partitie(int st,int dr)
{
    int i=st-1, j=dr+1;
    double val = r[st+rand()%(dr-st+1)];

    while (1)
    {
        do i++; while ( val-r[i]>=er ) ;
        do j--; while ( r[j]-val>=er ) ;

        if (i<j)
            swap(r[i],r[j]);
        else
            return j;
    }
}

double divide(int st,int dr,int k)
{
    if (st==dr) return r[st];
    int q;

    q=partitie(st,dr);

    if (k<=q)
        return divide(st,q,k);
    else
        return divide(q+1,dr,k);
}



void solve()
{
    int i,j;
    for (i=1;i<=m;i++)
    {
        for (j=0,nr=0;j<n;j++)
            if (l[i]>=v[j].X)
                r[++nr] = dist(v[j],l[i]);

       fprintf(g,"%.4lf\n", sqrt(divide(1,nr,k[i])));
    }
}

int main()
{

    read();
    solve();

    return 0;
}