Pagini recente » Cod sursa (job #1927276) | Cod sursa (job #3149988) | Cod sursa (job #2741198) | Cod sursa (job #1716927) | Cod sursa (job #2906458)
#include <bits/stdc++.h>
using namespace std;
ifstream in("roata.in");
ofstream out("roata.out");
struct info {
unsigned long long int nor;
int nrinsir, nrinroata;
info(unsigned long long int a, int b, int c)
: nor(a), nrinsir(b), nrinroata(c) {}
};
struct cmp {
bool operator()(info const& a, info const& b) {
if(a.nor==b.nor)
return a.nrinroata>b.nrinroata;
return a.nor>b.nor;
}
};
int order[100000];
int main()
{
priority_queue<info, vector<info>, cmp> heap;
int n, p, cnt=0, eur, last, ind=0;
unsigned long long int s=0, delay=0;
queue<int> q;
in>>n>>p;
while(cnt<min(n, p)) {
in>>eur;
s+=eur;
heap.push(info(eur, cnt+1, cnt+1));
cnt++;
}
while(cnt<p) {
while(q.size()&&cnt<p) {
in>>eur;
s+=eur;
heap.push(info(eur+delay, cnt+1, q.front()));
q.pop();
cnt++;
}
unsigned long long int mini=heap.top().nor;
q.push(heap.top().nrinroata);
last=heap.top().nrinroata;
order[ind++]=heap.top().nrinsir;
delay+=mini-delay;
heap.pop();
while(heap.size()) {
if(heap.top().nor==mini) {
q.push(heap.top().nrinroata);
order[ind++]=heap.top().nrinsir;
last=heap.top().nrinroata;
heap.pop();
}
else
break;
}
}
while(heap.size()) {
order[ind++]=heap.top().nrinsir;
last=heap.top().nrinroata;
heap.pop();
}
out<<s<<"\n";
for(int i=0;i<ind;i++)
out<<order[i]<<" ";
out<<"\n";
out<<last;
}