#include<stdio.h>
#include<stdlib.h>
#define N 11
#define M 28
typedef int datatype;
typedef struct
{
datatype data[N];
int top;
}seqstack;
typedef struct
{
datatype data[M];
int front,rear;
}sequeue;
seqstack *Createstack()
{
seqstack *s;
s=(seqstack *)malloc(sizeof(seqstack));
s->top=-1;
return s;
}
void Pushstack(seqstack *s,datatype x)
{
s->data[++s->top]=x;
}
datatype Popstack(seqstack *s)
{
return s->data[s->top--];
}
int Emptystack(seqstack *s)
{
return (s->top==-1);
}
int Fullstack(seqstack *s)
{
return s->top==(N-1);
}
sequeue *Createqueue()
{
sequeue *sq;
sq=(sequeue *)malloc(sizeof(sequeue));
sq->front=sq->rear=0;
return sq;
}
void Enqueue(sequeue *sq,datatype x)
{
sq->rear=(sq->rear+1)%M;
sq->data[sq->rear]=x;
}
datatype Dequeue(sequeue *sq)
{
sq->front=(sq->front+1)%M;
return (sq->data[sq->front]);
}
int Fullqueue(sequeue *sq)
{
return ((sq->rear+1)%M==sq->front);
}
int flag(sequeue *sq)
{
datatype x;
int a=1,i=0;
for(i=1;i<=27;i++)
{
x=Dequeue(sq);
a&=(i==x);
Enqueue(sq,x);
}
if(a==1)return 1;
return 0;
}
int main()
{
seqstack *sa,*sb,*sc;
int i=0;
int n=0;
datatype x,a;
sa=Createstack();
sb=Createstack();
sc=Createstack();
sequeue *sq;
sq=Createqueue();
for(i=1;i<M;i++)
if( !Fullqueue(sq) ) Enqueue(sq,i);
while(1)
{
x=Dequeue(sq);
n++;
if(sa->top==3)
{
while(!Emptystack(sa)) Enqueue(sq,Popstack(sa));
if(Fullstack(sb))
{
while(!Emptystack(sb)) Enqueue(sq,Popstack(sb));
if(Fullstack(sc))
{
while(!Emptystack(sc)) Enqueue(sq,Popstack(sc));
Enqueue(sq,x);
if(flag(sq)) break;
}
else
{
Pushstack(sc,x);
}
}
else
{
Pushstack(sb,x);
}
}
else
{
Pushstack(sa,x);
}
}
printf("n=%d\n",n);
return 0;
}