Cod sursa(job #1848028)

Utilizator KOzarmOvidiu Badea KOzarm Data 15 ianuarie 2017 13:09:43
Problema Lupul Urias si Rau Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("lupu.in");
ofstream fout("lupu.out");

struct oaie
{
    int d,l;
}a[100005];

int n,x,l,q[100005],k;

bool cmp(oaie a,oaie b)
{
    if(a.d!=b.d)
        return a.d<b.d;
    else
        return a.l>b.l;
}

void adauga(int poz)
{
    while(poz/2>0&&q[poz/2]>q[poz])
    {
        swap(q[poz],q[poz/2]);
        poz/=2;
    }
}

void coboara(int poz)
{
    if(2*poz+1<=k)
    {
        if(q[2*poz+1]<q[2*poz])
        {
            if(q[2*poz+1]<q[poz])
            {
                swap(q[2*poz+1],q[poz]);
                coboara(2*poz+1);
            }
        }
        else
        {
            if(q[2*poz]<q[poz])
            {
                swap(q[2*poz],q[poz]);
                coboara(2*poz);
            }
        }
    }
    else
    if(2*poz<=k)
    {
        if(q[poz]>q[2*poz])
            swap(q[poz],q[2*poz]);
    }
}

int main()
{
    fin>>n>>x>>l;
    for(int i=1;i<=n;i++)
    {
        k++;
        fin>>a[k].d>>a[k].l;
        if(a[k].d>x)
            k--;
        else
            a[k].d=(x-a[k].d)/l;
    }
    n=k;
    k=0;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(a[i].d-k>=0)
        {
            k++;
            q[k]=a[i].l;
            adauga(k);
        }
        else
        if(a[i].l>q[1])
        {
            q[1]=a[i].l;
            coboara(1);
        }
    }
    long long sum=0;
    for(int i=1;i<=k;i++)
        sum+=q[i];
    fout<<sum;
    return 0;
}