namespace IO{
const int maxn(1<<21|1);
char ibuf[maxn],*iS,*iT,obuf[maxn],*oS=obuf,*oT=obuf+maxn-1,_c,st[55];
int _f,tp;
char Getc(){
return (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,maxn,stdin),(iS==iT?EOF:*iS++)):*iS++);
}
void Flush(){
fwrite(obuf,1,oS-obuf,stdout);
oS=obuf;
}
void Putc(char x){
*oS++=x;
if(oS==oT)Flush();
}
template<class Int>void Input(Int &x){
for(_f=0,_c=Getc();_c<'0'||_c>'9';_c=Getc())_f=_c=='-';
for(x=0;_c<='9'&&_c>='0';_c=Getc())x=(x<<3)+(x<<1)+(_c^48);
if(_f)x=-x;
}
template<class Int>void Print(Int x){
if(!x)Putc('0');
if(x<0)Putc('-'),x=-x;
while(x)st[++tp]=x%10+'0',x/=10;
while(tp)Putc(st[tp--]);
}
void Getstr(char *s,int &l){
for(_c=Getc();_c<'a'||_c>'z';_c=Getc());
for(l=0;_c>='a'&&_c<='z';_c=Getc())s[l++]=_c;
s[l]=0;
}
void Putstr(const char *s){
for(int i=0,n=strlen(s);i<n;++i)Putc(s[i]);
}
}