#include <iostream>
#include <cstdio>
using namespace std;
#define MAXSIZE 100
typedef int Status;
typedef char Elem;
typedef struct sqStack
{
int len;
Elem *base;
Elem *top;
}sqStack;
Status InitStack(sqStack &s)
{
s.base = new Elem[MAXSIZE];
if (!s.base) return -1;
s.top = s.base;
s.len = MAXSIZE;
return 1;
}
Status Push(sqStack &s, Elem e)
{
if (s.top - s.base == s.len) return -1;
else *s.top++ = e;
return 1;
}
Status Pop(sqStack &s, Elem &e)
{
if (s.top == s.base) return -1;
else e = *--s.top;
return 1;
}
Elem GetTop(sqStack &s)
{
if (s.top != s.base)
return *(s.top - 1);
else return -1;
}
Status StackEmpty(sqStack &s)
{
if (s.top == s.base)
return 1;
else return 0;
}
Status Marchting(sqStack &s)
{
InitStack(s);
int flag = 1;
char ch;
cin >> ch;
while (ch != '#' && flag)
{
char tmp;
switch (ch)
{
case '[':
case '(':
Push(s, ch);
break;
case ')':
if (!StackEmpty(s) && GetTop(s) == '(')
Pop(s, tmp);
else flag = 0;
break;
case ']':
if (!StackEmpty(s) && GetTop(s) == '[')
Pop(s, tmp);
else flag = 0;
break;;
}
cin >> ch;
}
if (StackEmpty(s) && flag)
return 1;
else return 0;
}
int main()
{
sqStack s;
cout << Marchting(s);
}