Pagini recente » Cod sursa (job #722988) | Cod sursa (job #2623891) | Cod sursa (job #1872645) | Cod sursa (job #1376675) | Cod sursa (job #1412977)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
pair<int,int> a[500001];
int i, n, tt, k, nav[500001];
long long mx, sol[500001];
inline void citeste(){
int st, dr, mij, poz, optim[500001], cntr;
scanf("%d%d%d", &n, &k, &tt);
for (i=1;i<=n;i++) scanf("%d%d", &a[i].second, &a[i].first);
sort(a+1, a+n+1); nav[0]=0;
for (i=1;i<=k;i++) {
nav[i]=nav[i-1]+a[i].second; optim[i]=a[i].second;
}
if (k<n) sort(optim+1, optim+k+1);
for (i=k+1;i<=n;i++) {
nav[i]=nav[i-1];
if (a[i].second<=optim[1]) continue;
if (a[i].second>=optim[k]) poz=k; else
while (st<=dr) {
mij=st+(dr-st)/2;
if (optim[mij]==a[i].second) {poz=mij; break;}
if (optim[mij]>a[i].second) dr=mij-1;
else {poz=mij; st=mij+1;}
}
nav[i]+=(a[i].second-optim[1]);
for (cntr=1;cntr<poz;cntr++) optim[cntr]=optim[cntr+1];
optim[cntr]=a[i].second;
}
}
inline void rez(){
bool ok=true;
vector<int> cd;
vector<int>::iterator it;
stack<int> st;
cd.push_back(0);
while (ok){
ok=false;
///pentru plasa i
///timp=a[i].first
///cantitate=nav[i]
for (it=cd.begin();it!=cd.end();it++) {
for (i=1;i<=n;i++)
if (*it+a[i].first<=tt)
if ((sol[*it+a[i].first]==0)||(sol[*it+a[i].first]<sol[*it]+nav[i])) {
ok=true;
if (sol[*it+a[i].first]==0) st.push(*it+a[i].first);
sol[*it+a[i].first]=sol[*it]+nav[i];
if (mx<sol[*it+a[i].first]) mx=sol[*it+a[i].first];
}
}
while (!st.empty()) {cd.push_back(st.top()); st.pop();}
}
}
int main(){
freopen("peste.in","r",stdin);
freopen("peste.out","w",stdout);
citeste(); rez();
printf("%lld\n", mx);
return 0;
}