Cod sursa(job #1237605)

Utilizator MaarcellKurt Godel Maarcell Data 4 octombrie 2014 14:00:31
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int N,Q, a[110][5050],aux[505000];

int modul(int x){
    if (x<0)
        x*=-1;
    return x;
}

int min_mod(int x, int y){
    int i=1,j=1,k=0,MIN=(1<<30);

    while (i<=a[x][0] && j<=a[y][0]){
        if (k)
            MIN=min(MIN,modul(aux[k]-a[x][i]));

        for (;a[x][i]<=a[y][j] && i<=a[x][0]; i++)
            aux[++k]=a[x][i];

        MIN=min(MIN,modul(aux[k]-a[y][j]));

        for (;a[y][j]<=a[x][i] && j<=a[y][0]; j++)
            aux[++k]=a[y][j];
    }

    if (i<=a[x][0])
        MIN=min(MIN,modul(a[x][i]-aux[k]));
    if (j<=a[y][0]);
        MIN=min(MIN,modul(a[y][j]-aux[k]));

    return MIN;
}

int valid(int val, int x, int y){
    int i,j,cnt=0,sum=0;

    for (i=x; i<=y; i++){
        sum+=a[i][0];
        for (j=1; j<=a[i][0]; j++)
            if (a[i][j]<=val)
                cnt++;
    }

    if (cnt<sum/2-1)
        return -1;
    else if (cnt>sum/2-1)
        return 1;
    else
        return 0;
}

int med(int x, int y){
    int l=-1000000000,r=1000000000,mid,i,j,k=0;

    /*while (l<=r){
        mid=(l+r)/2;
        aux=valid(mid,x,y);

        if (aux==-1)
            l=mid+1;
        else if (aux==1)
            r=mid-1;
        else
            return mid;
    }*/
    for (i=x; i<=y; i++)
        for (j=1; j<=a[i][0]; j++)
            aux[++k]=a[i][j];

    nth_element(aux+1,aux+(k/2),aux+k+1);
    return aux[k/2];
}

int main(){
    freopen("1-qvect.in","r",stdin);
    freopen("qvect.out","w",stdout);
    scanf("%d %d",&N,&Q);

    int i,j,t,x,y;
    for (i=1; i<=N; i++){
        scanf("%d",&a[i][0]);
        for (j=1; j<=a[i][0]; j++)
            scanf("%d",&a[i][j]);
    }

    for (i=1; i<=Q; i++){
        scanf("%d %d %d",&t,&x,&y);
        if (t==1)
            printf("%d\n",min_mod(x,y));
        else
            printf("%d\n",med(x,y));
    }

    return 0;
}