#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char *data;
    int top;
    int capacity;
} Stack;

Stack* createStack(int capacity) {
    Stack* s = (Stack*)malloc(sizeof(Stack));
    s -> capacity = capacity;
    s -> top = -1;
    s -> data = (char*)malloc(s -> capacity * sizeof(char));
    return s;
}

int isEmpty(Stack* s) {
    return s -> top == -1;
}

void push(Stack* s, char c) {
    s -> data[++(s -> top)] = c;
}

char pop(Stack* s) {
    if(isEmpty(s)) return '\0';
    return s -> data[(s -> top)--];
}

void freeStack(Stack* s) {
    free(s -> data);
    free(s);
}

int isMatching(char open, char close) {
    return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}');
}

int isValidParentheses(const char *s) {
    int len = strlen(s);
    Stack *st = createStack(len);
    for(int i = 0; i < len; i++) {
        char c = s[i];
        if(c == '(' || c == '[' || c == '{') {
            push(st, c);
        }
        else if(c == ')' || c == ']' || c == '}') {
            if(isEmpty(st)) {
                freeStack(st);
                return 0;
            }
            char top = pop(st);
            if(!isMatching(top, c)) {
                freeStack(st);
                return 0;
            }
        }
    }

    int result = isEmpty(st) ? 1 : 0;
    freeStack(st);
    return result;
}

void vanimain() {
    char *s = (char*)malloc(100005 * sizeof(char));
    if(scanf("%100004s", s) == 1) {
        printf("%d\n", isValidParentheses(s));
    }
    free(s);
}

int main() {
    vanimain();
    return 0;
}