Cod sursa(job #2915395)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 22 iulie 2022 15:44:01
Problema Lupul Urias si Rau Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
#define NMAX 100000
#define INF 2000000009

using namespace std;

class InParser {
	
private:
	
	FILE *fin;
	
	char *buff;
	
	int sp;
	
 
	
	char read_ch() {
	
		++sp;
	
		if (sp == 4096) {
	
			sp = 0;
	
			fread(buff, 1, 4096, fin);
	
		}
	
		return buff[sp];
	
	}
	
 
	
public:
	
	InParser(const char* nume) {
	
		fin = fopen(nume, "r");
	
		buff = new char[4096]();
	
		sp = 4095;
	
	}
	
	
	
	InParser& operator >> (int &n) {
	
		char c;
	
		while (!isdigit(c = read_ch()) && c != '-');
	
		int sgn = 1;
	
		if (c == '-') {
	
			n = 0;
	
			sgn = -1;
	
		} else {
	
			n = c - '0';
	
		}
	
		while (isdigit(c = read_ch())) {
	
			n = 10 * n + c - '0';
	
		}
	
		n *= sgn;
	
		return *this;
	
	}
	
	
	
	InParser& operator >> (long long &n) {
	
		char c;
	
		n = 0;
	
		while (!isdigit(c = read_ch()) && c != '-');
	
		long long sgn = 1;
	
		if (c == '-') {
	
			n = 0;
	
			sgn = -1;
	
		} else {
	
			n = c - '0';
	
		}
	
		while (isdigit(c = read_ch())) {
	
			n = 10 * n + c - '0';
	
		}
	
		n *= sgn;
	
		return *this;
	
	}
	
};

InParser in("lupu.in");
ofstream out("lupu.out");

pair <int, int> v[NMAX];
multiset <int> s;
multiset <int> :: iterator it;

int main()
{
    register long long sum = 0;
    register int i, prev, x, l, n;

    in >> n >> x >> l;

    for (i = 0; i < n; ++i) {
        in >> v[i].first >> v[i].second;
        v[i].first = (l + x - v[i].first) / l;
    }

    sort(v, v + n);

    i = n - 1, prev = v[n - 1].first;
    while (i >= 0 && v[i].first > 0) {

        if (prev != v[i].first) {

            while (prev - v[i].first && !s.empty()) {
                it = s.begin();
                sum -= (*it);
                s.erase(it);
                --prev;
            }

            prev = v[i].first;
        }

        s.insert(-v[i].second);
        --i;
    }

    while (prev > 0 && !s.empty()) {
        it = s.begin();
        sum -= (*it);
        s.erase(it);
        --prev;
    }

    out << sum;
    return 0;
}