Cod sursa(job #2906458)

Utilizator MoarcascosminMoarcas Cosmin Moarcascosmin Data 26 mai 2022 08:39:54
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#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;
}