#pragma once
#include <iostream>
using namespace std;
const int N = 100;
class longint {
private:
	char* m;
public:
    longint() { m = new char[N]; };
    longint(const longint& l);
    //longint(char* s);
    longint& operator=(const longint& l);
    friend longint operator+(longint& l1, longint& l2);
    friend ostream& operator<<(ostream& out, const longint& l);
    friend istream& operator>>(istream& in, longint& l);
    ~longint() { delete[] m; m = nullptr; }
};

longint::longint(const longint& l) {
    m = new char[N];
    for (int i = 0; i <= strlen(l.m); i++)
        m[i] = l.m[i];
};

longint& longint::operator=(const longint& l) {
    for (int i = 0; i <= strlen(l.m); i++)
        m[i] = l.m[i];
    return *this;
};

istream& operator>>(istream& in, longint& l) {
    char* s = new char[N];
    in >> s;
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        l.m[i] = s[len - i - 1];
    }
    l.m[len] = '\0';
    delete[] s;
    return in;
};

ostream& operator<<(ostream& out, const longint& l) {
    int len = strlen(l.m);
    for (int i = 0; i < strlen(l.m); i++)
        out << l.m[len - i - 1];
    return out;
}

longint operator+(longint& l1, longint& l2) {
    longint t;
    int len1 = strlen(l1.m), len2 = strlen(l2.m);
    if (len1 < len2) {
        for (int i = 0; i < len2 - len1; i++)
            l1.m[len1 + i] = '0';
        l1.m[len2] = '\0';
        len1 = len2;
    }
    if (len1 > len2) {
        for (int i = 0; i < len1 - len2; i++)
            l2.m[len2 + i] = '0';
        l2.m[len1] = '\0';
        len2 = len1;
    }
    int r = 0;
    for (int i = 0; i < len1; i++) {
        t.m[i] = (l1.m[i]-'0') + (l2.m[i] - '0') + r;
        r = t.m[i] / 10;
        t.m[i] %= 10;
        t.m[i] += '0';
    }
    if (r > 0){
        t.m[len1] = r + '0';
        len1++;
    }
    t.m[len1] = '\0';
    return t;
}