Cod sursa(job #3210141)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 5 martie 2024 11:17:17
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>
#define L 1000005
//#define MAX_PRICE 1000001
//#define lsb(x) (x & (-x))
using namespace std;

//long long aib1[L], aib2[L];
priority_queue <pair <long long, long long>> pq;
vector <pair <int, int>> sold;
/*
void update1(long long pos, long long val) {
  for (; pos <= MAX_PRICE; pos += lsb(pos))
    aib1[pos] += val;
}

void update2(long long pos, long long val) {
  for (; pos <= MAX_PRICE; pos += lsb(pos))
    aib2[pos] += val;
}
*/
int main() {
  string str;
  while (cin >> str) {
    long long n, p;
    cin >> n >> p;
    if (str[0] == 'A') {
      //update1(p, n);
      //update2(p, n * p);
      pq.push({-p, n});
    }
    else {
      /*while (!pq.empty()) {
        cout << -pq.top().first << " " << pq.top().second << "\n";
        pq.pop();
      }
      cout << "\n";*/

      long long s = 0, val = 0;
      bool ok = true;
      sold.clear();
      while (true) {
        if (pq.empty()) {
          ok = false;
          break;
        }
        long long topPrice = -pq.top().first, quant = 0;
        while (!pq.empty() && -pq.top().first == topPrice) {
          quant += pq.top().second;
          pq.pop();
        }
        sold.push_back({-topPrice, quant});
        if (s + quant < n) {
          s += quant;
          val += topPrice * quant;
        }
        else
          break;
      }
      //cout << "! " << n - s << " " << -sold.back().first << " !\n";
      if (ok && val + (n - s) * (-sold.back().first) <= p) {
        pq.push({sold.back().first, sold.back().second - (n - s)});
        //cout << "!!! " << sold.back().first << " " << sold.back().second - (n - s) << " !!!\n";
        cout << "HAPPY\n";
      }
      else {
        for (auto it : sold)
          pq.push(it);
        cout << "UNHAPPY\n";
      }
      //cout << "\n\n\n\n\n";
    }
  }
  return 0;
}