#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>

using namespace std;

struct Data{
	Data(){
		real = imaginary = 0;
	}
	Data(int arg_real,int arg_imaginary){
		real = arg_real;
		imaginary = arg_imaginary;
	}
	int real,imaginary;
};

int main(){

	int tmp,count,calc_length,next_real,next_imaginary;
	char line[110],calc;
	stack<Data> NUM,work_num;
	stack<char> OP,work_op;
	Data op1,work,work2;

	bool numFLG,overFLG;

	while(scanf("%s",line) != EOF){

		for(calc_length = 0; line[calc_length] != '\0';calc_length++);
		line[calc_length++] = '='; //??¢?????´??????????????¨?????????
		line[calc_length] = '\0';

		tmp = 0;
		numFLG = false;
		overFLG = false;

		while(!NUM.empty())NUM.pop();
		while(!work_num.empty())work_num.pop();
		while(!OP.empty())OP.pop();
		while(!work_op.empty())work_op.pop();


		for(int k = 0; line[k] != '\0';){

			if(line[k] >= '0' && line[k] <= '9'){
				numFLG = true;
				tmp = 10*tmp + (line[k] - '0');

				if(tmp > 10000){
					overFLG = true;
					break;
				}
				k++;
			}else{

				if(numFLG == true){

					if(tmp > 10000){
						overFLG = true;
						break;
					}

					if(line[k] == '*' && line[k+1] == 'i'){
						if(OP.empty() == false && OP.top() == '*'){
							calc = OP.top();
							OP.pop();
							op1 = NUM.top();
							NUM.pop();

							if(abs(tmp*op1.real) > 10000 || abs(tmp*op1.imaginary) > 10000){
								overFLG = true;
								break;
							}else{
								if(op1.imaginary != 0){
									NUM.push(Data(-op1.imaginary*tmp,tmp*op1.real));
								}else{ //op1.imaginary == 0
									NUM.push(Data(0,tmp*op1.real));
								}
							}
						}else{
							NUM.push(Data(0,tmp));
						}
						k += 2;
						numFLG = false;
						tmp = 0;
						continue;
					}else{
						if(OP.empty() == false && OP.top() == '*'){
							calc = OP.top();
							OP.pop();
							op1 = NUM.top();
							NUM.pop();

							if(abs(tmp*op1.real) > 10000 || abs(tmp*op1.imaginary) > 10000){
								overFLG = true;
								break;
							}else{
								NUM.push(Data(tmp*op1.real,tmp*op1.imaginary));
							}
						}else{
							NUM.push(Data(tmp,0));
						}
					}
					numFLG = false;
					tmp = 0;
				}

				if(line[k] == '+' ||line[k] == '*' || line[k] == '-' || line[k] == '('){
					OP.push(line[k]);
					k++;
				}else if(line[k] == 'i'){
					if(OP.empty() == false && OP.top() == '*'){
						calc = OP.top();
						OP.pop();
						op1 = NUM.top();
						NUM.pop();

						NUM.push(Data(-op1.imaginary,op1.real));

					}else{
						NUM.push(Data(0,1));
					}
					k++;
				}else if(line[k] == ')'){

					work = NUM.top();
					NUM.pop();
					work_num.push(work);

					count = 0;

					while(true){
						calc = OP.top();
						OP.pop();
						if(calc == '(')break;

						count++;

						work_op.push(calc);

						work = NUM.top();
						NUM.pop();
						work_num.push(work);
					}

					if(count == 0){
						work = work_num.top();
						work_num.pop();
					}else{

						work = work_num.top();
						work_num.pop();

						while(!work_num.empty()){
							calc = work_op.top();
							work_op.pop();

							if(calc == '+'){
								work.real += work_num.top().real;
								work.imaginary += work_num.top().imaginary;
								if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
									overFLG = true;
									break;
								}
							}else if(calc == '-'){
								work.real -= work_num.top().real;
								work.imaginary -= work_num.top().imaginary;
								if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
									overFLG = true;
									break;
								}
							}else if(calc == '*'){

								if(work.imaginary != 0 && work_num.top().imaginary != 0){
									next_real = work.real*work_num.top().real-work.imaginary*work_num.top().imaginary;
									next_imaginary = work.real*work_num.top().imaginary+work.imaginary*work_num.top().real;
								}else if(work.imaginary == 0){
									next_real = work.real*work_num.top().real;
									next_imaginary = work.real*work_num.top().imaginary;
								}else if(work_num.top().imaginary == 0){
									next_real = work.real*work_num.top().real;
									next_imaginary = work.imaginary*work_num.top().real;
								}else{
									next_real = work.real*work_num.top().real;
									next_imaginary = 0;
								}

								work.real = next_real;
								work.imaginary = next_imaginary;

								if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
									overFLG = true;
									break;
								}
							}
							work_num.pop();
						}
					}

					if(OP.empty() == false && OP.top() == '*'){
						OP.pop();
						work2 = NUM.top();
						NUM.pop();

						if(work.imaginary != 0 && work2.imaginary != 0){
							next_real = work2.real*work.real-work2.imaginary*work.imaginary;
							next_imaginary = work2.real*work.imaginary+work2.imaginary*work.real;
						}else if(work.imaginary == 0){
							next_real = work2.real*work.real;
							next_imaginary = work2.imaginary*work.real;
						}else if(work2.imaginary == 0){
							next_real = work2.real*work.real;
							next_imaginary = work2.real*work.imaginary;
						}else{
							next_real = work2.real*work.real;
							next_imaginary = 0;
						}

						work.real = next_real;
						work.imaginary = next_imaginary;

						if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
							overFLG = true;
							break;
						}
					}
					NUM.push(work);
					k++;
				}else{	//line[k] == '='

					work = NUM.top();
					NUM.pop();
					work_num.push(work);

					while(!NUM.empty()){
						calc = OP.top();
						OP.pop();

						work_op.push(calc);

						work = NUM.top();
						NUM.pop();
						work_num.push(work);
					}

					work = work_num.top();
					work_num.pop();

					while(!work_num.empty()){
						calc = work_op.top();
						work_op.pop();

						if(calc == '+'){
							work.real += work_num.top().real;
							work.imaginary += work_num.top().imaginary;
							if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
								overFLG = true;
								break;
							}
						}else if(calc == '-'){
							work.real -= work_num.top().real;
							work.imaginary -= work_num.top().imaginary;
							if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
								overFLG = true;
								break;
							}
						}else if(calc == '*'){

							if(work.imaginary != 0 && work_num.top().imaginary != 0){
								next_real = work.real*work_num.top().real-work.imaginary*work_num.top().imaginary;
								next_imaginary = work.real*work_num.top().imaginary+work.imaginary*work_num.top().real;
							}else if(work.imaginary == 0){
								next_real = work.real*work_num.top().real;
								next_imaginary = work.real*work_num.top().imaginary;
							}else if(work_num.top().imaginary == 0){
								next_real = work.real*work_num.top().real;
								next_imaginary = work.imaginary*work_num.top().real;
							}else{
								next_real = work.real*work_num.top().real;
								next_imaginary = 0;
							}

							work.real = next_real;
							work.imaginary = next_imaginary;

							if(abs(work.real) > 10000 || abs(work.imaginary) > 10000){
								overFLG = true;
								break;
							}
						}
						work_num.pop();
					}
					if(overFLG)break;

					if(work.real != 0 || work.imaginary == 0){
						printf("%d",work.real);
					}
					if(work.imaginary > 0){
						if(work.real != 0){
							printf("+%di",work.imaginary);
						}else{
							printf("%di",work.imaginary);
						}
					}else if(work.imaginary < 0){
						printf("%di",work.imaginary);
					}
					printf("\n");
					k++;
				}
				if(overFLG)break;
			}
		}
		if(overFLG)printf("overflow\n");
	}
	return 0;
}

Measured memory_bytes: 2588