Go: package main

import (
	"bufio"
	"fmt"
	"math/big"
	"os"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func main() {
	sc.Scan()
	dataset, _ := strconv.Atoi(sc.Text())
	var firstdata *big.Int

	for i := 0; i < dataset*2; i++ {
		n := new(big.Int)
		sc.Scan()
		data, _ := n.SetString(sc.Text(), 10)

		if i%2 == 0 {
			firstdata = data
			continue
		}

		result := new(big.Int)
		if result := result.Add(data, firstdata); len(result.String()) > 80 {
			fmt.Println("overflow")
			continue
		} else {
			fmt.Println(result)
		}
	}
}

C++: #include <iostream>
#include <iomanip>
#include <cassert>
#include <string>

using namespace std;

typedef long long ll;

const ll BASE = 10000;
const int LogB = 4;
const int MAX_DIGIT = 100;

struct Bigint {
	ll digit[MAX_DIGIT];
	int size;
	Bigint (int sz = 1, ll a = 0) : size(sz) {
		memset(digit, 0, sizeof(digit));
		digit[0] = a;
	}
};

const Bigint ZERO(1,0), ONE(1, 1);

bool operator < (Bigint x, Bigint y) {
	if (x.size != y.size) return x.size < y.size;
	for (int i=x.size-1; i>=0; i--) if (x.digit[i] != y.digit[i]) return x.digit[i] < y.digit[i];
	return false;
}

bool operator > (Bigint x, Bigint y) { return y < x; }
bool operator <= (Bigint x, Bigint y) { return !(y < x); }
bool operator >= (Bigint x, Bigint y) { return !(x < y); }
bool operator != (Bigint x, Bigint y) { return x < y || y < x; }
bool operator == (Bigint x, Bigint y) { return !(x < y) && !(y < x); }

Bigint normal(Bigint x) {
	ll c = 0;
	for (int i=0; i<x.size; i++) {
		while (x.digit[i] < 0)
			x.digit[i+1] -= 1, x.digit[i] += BASE;
		ll a = x.digit[i] + c;
		x.digit[i] = a % BASE;
		c = a / BASE;
	}
	for (; c>0; c /= BASE) x.digit[x.size++] = c % BASE;
	while (x.size > 1 && x.digit[x.size-1] == 0) x.size--;
	return x;
}

Bigint convert(ll a) { return normal(Bigint(1, a)); }

Bigint convert(const string& s) {
	Bigint x;
	int i = s.size() % LogB;
	if (i > 0) i -= LogB;
	for (; i<(int)s.size(); i += LogB) {
		ll a = 0;
		for (int j=0; j<LogB; j++) a = 10 * a + (i+j >= 0 ? s[i+j] - '0' : 0);
		x.digit[x.size++] = a;
	}
	reverse(x.digit, x.digit+x.size);
	return normal(x);
}

ostream &operator << (ostream& os, Bigint x) {
	os << x.digit[x.size-1];
	for (int i=x.size-2; i>=0; i--) os << setw(LogB) << setfill('0') << x.digit[i];
	return os;
}

istream &operator >> (istream& is, Bigint &x) {
	string s; is >> s;
	x = convert(s);
	return is;
}

Bigint operator + (Bigint x, Bigint y) {
	if (x.size < y.size) x.size = y.size;
	for (int i=0; i<y.size; i++) x.digit[i] += y.digit[i];
	return normal(x);
}

Bigint operator - (Bigint x, Bigint y) {
	assert(x >= y);
	for (int i=0; i<y.size; i++) x.digit[i] -= y.digit[i];
	return normal(x);
}

Bigint operator * (Bigint x, Bigint y) {
	Bigint z(x.size + y.size);
	for (int i=0; i< x.size; i++)
		for (int j=0; j<y.size; j++)
			z.digit[i+j] += x.digit[i] * y.digit[j];
	return normal(z);
}

Bigint operator * (Bigint x, ll a) {
	for (int i=0; i<x.size; i++)
		x.digit[i] *= a;
	return normal(x);
}

pair<Bigint, ll> divmod(Bigint x, ll a) {
	ll c = 0, t;
	for (int i=x.size-1; i>=0; i--) {
		t = BASE*c + x.digit[i];
		x.digit[i] = t / a;
		c = t % a;
	}
	return pair<Bigint, ll>(normal(x), c);
}

Bigint operator / (Bigint x, ll a) { return divmod(x, a).first; }

ll operator % (Bigint x, ll a) { return divmod(x, a).second; }

pair<Bigint, Bigint> divmod(Bigint x, Bigint y) {
	if (x.size < y.size) return pair<Bigint, Bigint>(ZERO, x);
	int F =BASE / (y.digit[y.size-1] + 1);
	x = x * F; y = y * F;
	Bigint z(x.size - y.size + 1);
	for (int k = z.size - 1, i = x.size-1; k >= 0; k--, i--) {
		z.digit[k] = (i+1 < x.size ? x.digit[i+1] : 0) * BASE + x.digit[i];
		z.digit[k] /= y.digit[y.size-1];
		Bigint t(k + y.size);
		for (int j=0; j < y.size; j++) t.digit[k+j] = z.digit[k] * y.digit[j];
		t = normal(t);
		while (x < t) {
			z.digit[k] -= 1;
			for (int j = 0;j<y.size; j++) t.digit[k+j] -= y.digit[j];
			t = normal(t);
		}
		x = x-t;
	}
	return pair<Bigint, Bigint>(normal(z), x/F);
}

Bigint operator / (Bigint x, Bigint y) { return divmod(x, y).first; }

Bigint operator % (Bigint x, Bigint y) { return divmod(x, y).second; }

int main() {
	int n;
	cin >> n;
	string s1, s2;
	
	for (int i=0; i<n; i++) {
		cin >> s1 >> s2;
		Bigint x = convert(s1), y = convert(s2);
		Bigint z = x + y;
		if (z.size > 80) cout << "overflow" << endl;
		else cout << z << endl;
	}
	
	return 0;
}

C++: #include <iostream>
#include <string>

using namespace std;

int main() {
	int N; cin >> N;
	for (int i=0; i<N; i++) {
		string a, b;
		cin >> a >> b;
		int sum, ret=0;
		if (a.length() < b.length()) swap(a,b);
		int l = b.length()-1;
		for (int i=a.length()-1; i>=0; i--) {
			if (l >= 0) {
				sum = (a[i]-48)+(b[l]-48)+ret;
				l--;
			} else {
				sum = (a[i]-48)+ret;
			}
			if (sum>=10) {
				ret = 1;
				sum -= 10;
			} else {
				ret = 0;
			}
			a[i] = sum+48;
		}
		if (ret != 0) {
			a.insert(a.begin(), ret+48);
		}
		if (a.length() > 80) cout << "overflow" << endl;
		else cout << a << endl;
	}
	return 0;
}

C++: 
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <stack>
#include <cctype>
#include <complex>
#include <vector>
#include <algorithm>
#include <cstring>		//strlen

using namespace std;



bool solve(){
	char str1[10000],str2[10000];
	scanf("%s %s",str1,str2);
	int n1 = strlen(str1);
	int n2 = strlen(str2);	
	int n  = max(n1,n2);
	char str[10000];

	int c = 0;
	int i=0;
	while(i<n){
		int a = c;
		if(i<n1){
			a += (str1[n1-i-1]-'0');
		}
		if(i<n2){
			a += (str2[n2-i-1]-'0');
		}
		c = a/10; 
		a = a%10;
		
		str[i] = a + '0';
		i++;
	}
	if(c){
		str[i] = c + '0';
		i++;
	}
	
	if(i>81){
		cout<< "overflow"<<endl;
		return true;
	}
	
	for(int j=i-1;j>=0;j--){
		cout<< str[j];
	}
	cout<<endl;
	
	return true;
}

int main(){
	cout.setf(ios::fixed);
	cout.precision(5);
	int n;
	cin>> n;
	for(int i=0;i<n;i++){
		solve();
	}
	return 0;
}