Pagini recente » Cod sursa (job #3128943) | Monitorul de evaluare | Istoria paginii runda/testround13 | Cod sursa (job #2147348) | Cod sursa (job #1243189)
#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,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 && H[poz*2]>H[poz]) || (poz*2+1<=lg+1 && H[poz*2+1]>H[poz]))
{
if ((H[poz*2+1]<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]);
T[i].val=(dist-d[i])/l+1;
T[i].ord=i;
}
sort(T+1,T+n+1,cmp);
int Max=T[1].val;
i=1;
for (int k=Max;k>=1;--k)
{
while (T[i].val==k)
{
bagaheap(T[i].ord);
++i;
}
sum+=a[H[1]];
scoate(1);
}
printf("%d\n",sum);
return 0;
}