#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef struct
{
char data[100];
int top;
}Lnode;
void Init(Lnode *&s) //初始化栈
{
s=(Lnode *)malloc(sizeof(Lnode));
s->top=-1;
}
bool push(Lnode *&s,char a) //进栈
{
if(s->top==99) return false;
s->top++; //栈顶指针加1
s->data[s->top]=a; //栈顶元素压如栈中
return true;
}
bool pop(Lnode *&s,char a) //出栈
{
if(s->top==-1) return false;
a=s->data[s->top];
s->top--;
return true;
}
bool isleft(char a)
{
return (a=='(')||(a=='[');
}
bool isright(char a)
{
return (a==')')||(a==']');
}
bool juge(char a,char b)
{
return (a=='(' && b==')')||(a=='[' && b==']');
}
int main()
{
Lnode *st;
int i,n;
char a;
Init(st);
char str[100];
cin>>str;
n=strlen(str);
for(i=0;i<n;i++)
{
if(isleft(str[i]))
{
push(st,str[i]);
}
else
{
if(isright(str[i]))
{
if(!juge(st->data[st->top],str[i]))
{
cout<<"NO";
return 0;
}
pop(st,a); //a来存弹出的栈顶元素值
}
}
}
cout<<"YES";
return 0;
}