Cod sursa(job #1243216)

Utilizator gapdanPopescu George gapdan Data 15 octombrie 2014 17:51:04
Problema Lupul Urias si Rau Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
#include<algorithm>
#define NMAX 100001
using namespace std;
int H[NMAX*2+5],d[NMAX],a[NMAX];
int n,l,dist,lg,i;
long long sum;
struct lup
{
    int val,ord;
}T[NMAX];
int cmp(lup r,lup p)
{
    if (r.val<p.val) return 0;
    return 1;
}
void urca(int poz)
{
    while (poz>1 && a[H[poz]]>a[H[poz/2]])
    {
        swap(H[poz],H[poz/2]);
        poz=poz/2;
    }
}
void bagaheap(int nr)
{
    ++lg;
    H[lg]=nr;
    urca(lg);
}
void coboara(int poz)
{
    while ((poz*2<=lg && a[H[poz*2]]>a[H[poz]]) || (poz*2+1<=lg+1 && a[H[poz*2+1]]>a[H[poz]]))
    {
        if ((a[H[poz*2+1]]<a[H[poz*2]]) || (poz*2+1>lg))
        {
            swap(H[poz],H[poz*2]);
            poz=poz*2;
        }
        else
        {
            swap(H[poz],H[poz*2+1]);
            poz=poz*2+1;
        }
    }
}
void scoate(int poz)
{
    swap(H[1],H[lg]);
    --lg;
    coboara(1);
}
int main()
{
    freopen("lupu.in","r",stdin);
    freopen("lupu.out","w",stdout);
    scanf("%d%d%d",&n,&dist,&l);
    for (i=1;i<=n;++i)
    {
    scanf("%d%d",&d[i],&a[i]);
    if (d[i]<=dist) {T[i].val=(dist-d[i])/l+1,T[i].ord=i;}
    }
    sort(T+1,T+n+1,cmp);
    for (i=1;i<=n;++i)
    {
        bagaheap(T[i].ord);
        if (T[i].val!=T[i+1].val)
        {
            sum+=a[H[1]];
            if (lg==1) --lg,H[1]=0;
                else scoate(1);
        }
    }
    printf("%lld\n",sum);
    return 0;
}