Pagini recente » Cod sursa (job #2868526) | Cod sursa (job #2793114) | Cod sursa (job #1794559) | Cod sursa (job #1799538) | Cod sursa (job #339819)
Cod sursa(job #339819)
#include <iostream.h>
#include <stdio.h>
#include <algorithm>
#define nmax 100001
using namespace std;
struct oi {int d,a,t;} oaie[nmax];
int n,x,l,h[nmax],i,j;
long long int S;
void urca(int nod)
{int aux;
while(nod/2 && h[nod/2]<h[nod])
{aux=h[nod/2];h[nod/2]=h[nod];h[nod]=aux;
nod/=2;}
}
void coboara(int nodfiu)
{int nod=0,aux;
while(nodfiu!=nod)
{nod=nodfiu;
if(nod*2<=h[0] && h[nodfiu]<h[nod*2]) nodfiu=nod*2;
if(nod*2+1<=h[0] && h[nodfiu]<h[nod*2+1]) nodfiu=nod*2+1;
aux=h[nodfiu];h[nodfiu]=h[nod];h[nod]=aux;
}
}
void citire()
{freopen("lupu.in","r",stdin);
scanf("%d %d %d",&n,&x,&l);
for(i=1;i<=n;i++) scanf("%d %d",&oaie[i].d,&oaie[i].a);
fclose(stdin);
}
void scriere()
{freopen("lupu.out","w",stdout);
printf("%lld\n",S);
fclose(stdout);
}
bool cmp(oi b,oi c)
{return b.t<c.t;}
int main()
{citire();
if(!l) {for(i=1;i<=n;i++)
if(oaie[i].d<=x) S+=oaie[i].a;
}
else {for(i=1;i<=n;i++)
if(oaie[i].d<=x) oaie[i].t=1+(x-oaie[i].d)/l;
sort(oaie+1,oaie+1+n,cmp);
i=oaie[n].t;j=n;
for(;i>=1;i--)
{for(;j>=1;j--)
{if(oaie[j].t==i)
{h[++h[0]]=oaie[j].a;urca(h[0]);}
else
break;
}
if(h[0])
{S+=h[1];h[1]=h[h[0]--];
coboara(1);}
}
}
scriere();
return 0;
}