class Polynomial {
private:
    Node* head;

public:
    Polynomial() : head(nullptr) {}

    // Insert a new term in descending order of powers
    void insertTerm(int coeff, int power) {
        Node* newNode = new Node(coeff, power);

        // if list is empty or new term has highest power
        if (!head || head->power < power) {
            newNode->next = head;
            head = newNode;
            return;
        }

        Node* temp = head;
        Node* prev = nullptr;

        while (temp && temp->power > power) {
            prev = temp;
            temp = temp->next;
        }

        // if same power → combine coefficients
        if (temp && temp->power == power) {
            temp->coeff += coeff;
            delete newNode;
        } else {
            newNode->next = temp;
            if (prev) prev->next = newNode;
        }
    }

    // Display the polynomial
    void display() const {
        Node* temp = head;
        while (temp) {
            cout << temp->coeff << "x^" << temp->power;
            if (temp->next && temp->next->coeff >= 0) cout << " + ";
            else if (temp->next) cout << " ";
            temp = temp->next;
        }
        cout << endl;
    }

    // Add two polynomials
    static Polynomial add(const Polynomial& p1, const Polynomial& p2) {
        Polynomial result;
        Node* a = p1.head;
        Node* b = p2.head;

        while (a || b) {
            if (a && (!b || a->power > b->power)) {
                result.insertTerm(a->coeff, a->power);
                a = a->next;
            } else if (b && (!a || b->power > a->power)) {
                result.insertTerm(b->coeff, b->power);
                b = b->next;
            } else {
                // same power
                result.insertTerm(a->coeff + b->coeff, a->power);
                a = a->next;
                b = b->next;
            }
        }

        return result;
    }
};