#include <bits/stdc++.h>
#define _nhatminh int main()
#define ll long long
#define str string
#define fir first
#define sec second
#define ld long double
#define pb push_back
#define MOD 100000009
#define freopen(name) if(fopen(name".INP","r")) {freopen (name".INP","r",stdin); freopen (name".OUT","w",stdout);}
#define ALL(x) (x).begin(),(x).end()
#define piint pair < int , int >
#define piL pair < int , ll>
#define pLL pair < ll , ll >
#define TIME (1.0*clock()/CLOCKS_PER_SEC)
using namespace std;
const int Max_n=1e5;
str cc123 ;
int n , q;
int s[4*Max_n+3] ;
vector < int > chuan ( vector < int > a , vector < int > b ){
if ( b == vector < int > {} ) return a ;
else if ( a == vector < int > {}) return b ;
else if ( a ==vector < int > {} && b == vector < int > {}) return {};
vector < int > c ;
c = a ;
int ktra = c.back() ;
int i = 0 ;
for (i = 0 ; i < b.size() ; i ++ ) {
if ( ktra != b[i] ) break ;
}
for (int j = i ; j < b.size() ; j ++ )
c.pb(b[j]) ;
return c ;
}
bool check_sub2 = 1 , check_sub3 = 1 ;
struct sacso1{
char wt ;
int l , r ;
};
sacso1 a[Max_n+3] ;
vector < int > mot[4*Max_n+3] ;
int g[4*Max_n+3] , lazy[4*Max_n+3];
void build_sub1 ( int id , int l , int r ){
if ( l == r ) {
mot[id].pb(s[l]) ;
g[id] = mot[id].size() ;
return ;
}
int m = ( l + r ) >> 1;
build_sub1 ( id * 2 , l , m ) ;
build_sub1 ( id * 2 + 1 , m + 1 , r );
vector < int > c_id2 = mot[id*2];
vector < int > c_id21 = mot[id*2+1] ;
mot[id] = chuan ( c_id2 , c_id21 ) ;
g[id] = mot[id].size() ;
}
void fix_sub1 ( int id , int l , int r){
if ( lazy[id] == 0 ) return ;
mot[id].clear() ;
mot[id].pb(lazy[id]) ;
if ( l == r) {
lazy[id] = 0 ;
return ;
}
if ( l != r ){
lazy[id*2] = lazy[id*2+1] = lazy[id] ;
}
lazy[id] = 0 ;
}
void update ( int id , int l , int r , int u , int v , int x ){
fix_sub1(id , l , r );
if ( u > r || v < l ) return ;
if ( u <= l && r <= v ){
lazy[id] = x ;
fix_sub1(id , l , r );
return ;
}
int m = ( l + r ) >> 1 ;
update ( id * 2 , l , m , u , v , x);
update ( id * 2 + 1 , m + 1 , r , u , v , x );
vector < int > c_id2 = mot[id*2];
vector < int > c_id21 = mot[id*2+1] ;
mot[id] = chuan ( c_id2 , c_id21 ) ;
g[id] = mot[id].size() ;
}
vector < int > get ( int id , int l , int r , int u , int v ){
fix_sub1 ( id , l , r );
if ( u > r || v < l ) return {} ;
if ( u <= l && r <= v ){
return mot[id] ;
}
int m = ( l + r )>> 1;
vector < int > c_id2 = get(id*2 , l , m , u , v );
vector < int > c_id21 = get(id * 2 + 1 , m + 1 , r , u , v ) ;
return chuan ( c_id2 , c_id21 ) ;
}
void sub1(){
build_sub1( 1 , 1 , n );
for (int i = 1 ; i <= q ; i ++ ){
if ( a[i].wt == 'g'){
vector < int > c = get ( 1 , 1 , n , a[i].l , a[i].r);
cout << c.size() << '\n';
}
else update(1 ,1 , n , a[i].l , a[i].r , a[i].wt );
}
}
pair < ll , ll > hai[Max_n+3];
void sub2() {
for (int i = 1 ; i <= n ; i ++ )
{
hai[i] = hai[i-1];
if (s[i] != s[i-1]) {
hai[i].sec+=1;
hai[i].fir = i - 1;
}
}
for (int i = 1 ; i <= q ; i ++ ){
cout << hai[a[i].r].sec - hai[hai[a[i].l].fir].sec << '\n';
}
}
int back_3[4*Max_n+4] , front_3[4*Max_n+3] ;
int lazy_3[4*Max_n+3] ;
void build_sub3( int id , int l , int r ){
if ( l == r){
front_3[id] = back_3[id] = s[l] ;
g[id] = 1 ;
return;
}
int m = ( l + r ) >> 1;
build_sub3 (id * 2 , l , m );
build_sub3 (id * 2 + 1 , m + 1 , r);
if (front_3[id*2+1] != back_3[id*2]){
g[id] = g[id*2] + g[id*2 + 1 ];
}
else {
g[id] = g[id*2] + g[id*2 + 1] - 1 ;
}
front_3[id] = front_3[id*2] ;
back_3[id] = back_3[id*2+1] ;
}
void fix_sub3 ( int id , int l , int r){
if ( lazy_3[id] == 0 ) return ;
front_3[id] = back_3[id] = lazy_3[id];
g[id] = 1 ;
//mot[id].pb(lazy[id]) ;
if ( l == r) {
lazy_3[id] = 0 ;
return ;
}
if ( l != r ){
lazy_3[id*2] = lazy_3[id*2+1] = lazy_3[id] ;
}
lazy_3[id] = 0 ;
}
void update_sub3( int id , int l , int r , int u , int v , int x ){
fix_sub3(id , l , r );
if ( u > r || v < l ) return ;
if ( u <= l && r <= v ){
lazy_3[id] = x ;
fix_sub3(id , l , r );
return ;
}
int m = ( l + r ) >> 1 ;
update_sub3( id * 2 , l , m , u , v , x);
update_sub3( id * 2 + 1 , m + 1 , r , u , v , x );
if (front_3[id*2+1] != back_3[id*2]){
g[id] = g[id*2] + g[id*2 + 1 ];
}
else {
g[id] = g[id*2] + g[id*2 + 1] - 1 ;
}
front_3[id] = front_3[id*2] ;
back_3[id] = back_3[id*2+1] ;
}
struct sacso{
int b , f , val ;
} ;
sacso get_3( int id , int l , int r , int u , int v ){
fix_sub3 ( id , l , r );
if ( u > r || v < l ) return { 0 , 0 , 0 } ;
if ( u <= l && r <= v ){
sacso c ;
c.b = back_3[id] ;
c.f = front_3[id] ;
c.val = g[id] ;
return c ;
}
int m = ( l + r )>> 1;
sacso c_id2 = get_3(id*2 , l , m , u , v );
sacso c_id21 = get_3(id * 2 + 1 , m + 1 , r , u , v ) ;
sacso ans ;
if ( c_id2.val == 0 && c_id21.val == 0 ) return { 0 , 0 , 0 } ;
if ( c_id2.val == 0 ) return c_id21 ;
else if ( c_id21.val == 0 ) return c_id2 ;
if (c_id2.b == c_id21.f){
ans.val = c_id2.val + c_id21.val -1 ;
}
else ans.val = c_id2.val + c_id21.val ;
ans.f = c_id2.f;
ans.b = c_id21.b ;
return ans ;
}
void sub3() {
build_sub3( 1 , 1 , n );
for (int i = 1 ; i <= q ; i ++ ){
if ( a[i].wt == 'g'){
sacso c = get_3( 1 , 1 , n , a[i].l , a[i].r);
cout << c.val << '\n';
}
else update_sub3(1 ,1 , n , a[i].l , a[i].r , a[i].wt );
}
}
void solve(){
cin >> n >> q >> cc123 ;
for (int i = 1 ; i <= n ; i ++ )
s[i] = cc123[i-1] ;
for (int i = 1 ; i <= q ; i ++){
str wtc ; cin >> wtc ;
a[i].wt = wtc[0] ;
cin >> a[i].l >> a[i].r ;
//if ( a[i].wt == 'g') check_sub2 = 0 ;
if (a[i].wt == 'c') {
check_sub2 = 0 ;
cin >> a[i].wt ;
}
}
if (check_sub2) sub2();
else if ( n <= 1000 )sub1() ;
else sub3() ;
}
_nhatminh{
freopen("sacso");
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
solve();
cerr << '\n' << "Time elapsed " << TIME << "s.\n";
return (0);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgX25oYXRtaW5oICBpbnQgbWFpbigpCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgc3RyIHN0cmluZwojZGVmaW5lIGZpciBmaXJzdAojZGVmaW5lIHNlYyBzZWNvbmQKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIE1PRCAxMDAwMDAwMDkKI2RlZmluZSBmcmVvcGVuKG5hbWUpIGlmKGZvcGVuKG5hbWUiLklOUCIsInIiKSkge2ZyZW9wZW4gKG5hbWUiLklOUCIsInIiLHN0ZGluKTsgZnJlb3BlbiAobmFtZSIuT1VUIiwidyIsc3Rkb3V0KTt9CiNkZWZpbmUgQUxMKHgpICh4KS5iZWdpbigpLCh4KS5lbmQoKQojZGVmaW5lIHBpaW50IHBhaXIgPCBpbnQgLCBpbnQgPgojZGVmaW5lIHBpTCBwYWlyIDwgaW50ICwgbGw+CiNkZWZpbmUgcExMIHBhaXIgPCBsbCAsIGxsID4KI2RlZmluZSBUSU1FICgxLjAqY2xvY2soKS9DTE9DS1NfUEVSX1NFQykKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE1heF9uPTFlNTsKc3RyIGNjMTIzIDsKaW50IG4gLCBxOwppbnQgc1s0Kk1heF9uKzNdIDsKdmVjdG9yIDwgaW50ID4gY2h1YW4gKCB2ZWN0b3IgPCBpbnQgPiBhICwgdmVjdG9yIDwgaW50ID4gYiApewoJaWYgKCBiID09IHZlY3RvciA8IGludCA+IHt9ICkgcmV0dXJuIGEgOwoJZWxzZSBpZiAoIGEgPT0gdmVjdG9yIDwgaW50ID4ge30pIHJldHVybiBiIDsKCWVsc2UgaWYgKCBhID09dmVjdG9yIDwgaW50ID4ge30gJiYgYiA9PSB2ZWN0b3IgPCBpbnQgPiB7fSkgcmV0dXJuIHt9OwoJdmVjdG9yIDwgaW50ID4gYyA7CgljID0gYSA7CglpbnQga3RyYSA9IGMuYmFjaygpIDsKCWludCBpID0gMCA7Cglmb3IgKGkgPSAwIDsgaSA8IGIuc2l6ZSgpIDsgaSArKyApIHsKCQlpZiAoIGt0cmEgIT0gYltpXSApIGJyZWFrIDsgIAoJfQoJZm9yIChpbnQgaiA9IGkgOyBqIDwgYi5zaXplKCkgOyBqICsrICkKCQljLnBiKGJbal0pIDsKCXJldHVybiBjIDsKfQoKYm9vbCBjaGVja19zdWIyID0gMSAsIGNoZWNrX3N1YjMgPSAxIDsKc3RydWN0IHNhY3NvMXsKCWNoYXIgd3QgOyAKCWludCBsICwgciA7IAp9OwpzYWNzbzEgYVtNYXhfbiszXSA7CnZlY3RvciA8IGludCA+IG1vdFs0Kk1heF9uKzNdIDsKaW50IGdbNCpNYXhfbiszXSAsIGxhenlbNCpNYXhfbiszXTsKdm9pZCBidWlsZF9zdWIxICggaW50IGlkICwgaW50IGwgLCBpbnQgciApewoJaWYgKCBsID09IHIgKSB7CgkJbW90W2lkXS5wYihzW2xdKSA7CgkJZ1tpZF0gPSBtb3RbaWRdLnNpemUoKSA7CgkJcmV0dXJuIDsKCX0KCWludCBtID0gKCBsICsgciApID4+IDE7CglidWlsZF9zdWIxICggaWQgKiAyICwgbCAsIG0gKSA7CglidWlsZF9zdWIxICggaWQgKiAyICsgMSAsIG0gKyAxICwgciAgKTsKCXZlY3RvciA8IGludCA+IGNfaWQyID0gbW90W2lkKjJdOwoJdmVjdG9yIDwgaW50ID4gY19pZDIxID0gbW90W2lkKjIrMV0gOwoJbW90W2lkXSA9IGNodWFuICggY19pZDIgLCBjX2lkMjEgKSA7CglnW2lkXSA9IG1vdFtpZF0uc2l6ZSgpIDsKfQp2b2lkIGZpeF9zdWIxICggaW50IGlkICwgaW50IGwgLCBpbnQgIHIpewoJaWYgKCBsYXp5W2lkXSA9PSAwICkgcmV0dXJuIDsKCW1vdFtpZF0uY2xlYXIoKSA7IAoJbW90W2lkXS5wYihsYXp5W2lkXSkgOwoJaWYgKCBsID09IHIpIHsKCQlsYXp5W2lkXSA9IDAgOwoJCXJldHVybiA7Cgl9IAoJaWYgKCBsICE9IHIgKXsKCQlsYXp5W2lkKjJdID0gbGF6eVtpZCoyKzFdID0gbGF6eVtpZF0gOwoJfQoJbGF6eVtpZF0gPSAwIDsKfQp2b2lkIHVwZGF0ZSAoIGludCBpZCAsIGludCBsICwgaW50IHIgLCBpbnQgdSAsIGludCB2ICwgaW50IHggKXsKCWZpeF9zdWIxKGlkICwgbCAsIHIgKTsKCWlmICggdSA+IHIgfHwgdiA8IGwgKSByZXR1cm4gOwoJaWYgKCB1IDw9IGwgJiYgciA8PSB2ICl7CgkJbGF6eVtpZF0gPSB4IDsKCQlmaXhfc3ViMShpZCAsIGwgLCByICk7CgkJcmV0dXJuIDsKCX0KCWludCBtID0gKCBsICsgciApID4+IDEgOwoJdXBkYXRlICggaWQgKiAyICwgbCAsIG0gLCB1ICwgdiAsIHgpOwoJdXBkYXRlICggaWQgKiAyICsgMSAsIG0gKyAxICwgciAsIHUgLCB2ICwgeCApOwoJdmVjdG9yIDwgaW50ID4gY19pZDIgPSBtb3RbaWQqMl07Cgl2ZWN0b3IgPCBpbnQgPiBjX2lkMjEgPSBtb3RbaWQqMisxXSA7Cgltb3RbaWRdID0gY2h1YW4gKCBjX2lkMiAsIGNfaWQyMSApIDsKCWdbaWRdID0gbW90W2lkXS5zaXplKCkgOwp9CnZlY3RvciA8IGludCA+ICBnZXQgKCBpbnQgaWQgLCBpbnQgbCAsIGludCByICwgaW50IHUgLCBpbnQgdiApewoJZml4X3N1YjEgKCBpZCAsIGwgLCByICk7CglpZiAoIHUgPiByIHx8IHYgPCBsICkgcmV0dXJuIHt9IDsKCWlmICggdSA8PSBsICYmIHIgPD0gdiApewoJCXJldHVybiBtb3RbaWRdIDsKCX0KCWludCBtID0gKCBsICsgciApPj4gMTsgCgl2ZWN0b3IgPCBpbnQgPiBjX2lkMiA9IGdldChpZCoyICwgbCAsIG0gLCB1ICwgdiApOwoJdmVjdG9yIDwgaW50ID4gY19pZDIxID0gZ2V0KGlkICogMiArIDEgLCBtICsgMSAsIHIgLCB1ICwgdiApIDsKCXJldHVybiBjaHVhbiAoIGNfaWQyICwgY19pZDIxICkgOwp9CnZvaWQgc3ViMSgpewoJYnVpbGRfc3ViMSggMSAsIDEgLCBuICk7Cglmb3IgKGludCBpID0gMSA7IGkgPD0gcSA7IGkgKysgKXsKCQlpZiAoIGFbaV0ud3QgPT0gJ2cnKXsKCQkJdmVjdG9yIDwgaW50ID4gYyA9IGdldCAoIDEgLCAxICwgbiAsIGFbaV0ubCAsIGFbaV0ucik7CgkJCWNvdXQgPDwgYy5zaXplKCkgPDwgJ1xuJzsKCQl9CgkJZWxzZSB1cGRhdGUoMSAsMSAgLCBuICwgYVtpXS5sICwgYVtpXS5yICwgYVtpXS53dCApOwoJfQp9CnBhaXIgPCBsbCAsIGxsID4gaGFpW01heF9uKzNdOwp2b2lkIHN1YjIoKSB7Cglmb3IgKGludCBpID0gMSA7IGkgPD0gbiA7IGkgKysgKQoJewoJCWhhaVtpXSA9IGhhaVtpLTFdOwoJCWlmIChzW2ldICE9IHNbaS0xXSkgewoJCQloYWlbaV0uc2VjKz0xOwoJCQloYWlbaV0uZmlyID0gaSAtIDE7CgkJfQoJfQoJZm9yIChpbnQgaSA9IDEgOyBpIDw9IHEgOyBpICsrICl7CgkJY291dCA8PCBoYWlbYVtpXS5yXS5zZWMgLSBoYWlbaGFpW2FbaV0ubF0uZmlyXS5zZWMgPDwgJ1xuJzsKCX0KfQppbnQgYmFja18zWzQqTWF4X24rNF0gLCBmcm9udF8zWzQqTWF4X24rM10gOwppbnQgbGF6eV8zWzQqTWF4X24rM10gOwp2b2lkIGJ1aWxkX3N1YjMoIGludCBpZCAsIGludCBsICwgaW50IHIgKXsKCWlmICggbCA9PSByKXsKCQlmcm9udF8zW2lkXSA9IGJhY2tfM1tpZF0gPSBzW2xdIDsKCQlnW2lkXSA9IDEgOwoJCXJldHVybjsgCgl9CglpbnQgbSA9ICggbCArIHIgKSA+PiAxOwoJYnVpbGRfc3ViMyAoaWQgKiAyICwgbCAsIG0gKTsKCWJ1aWxkX3N1YjMgKGlkICogMiArIDEgLCBtICsgMSAsIHIpOwoJaWYgKGZyb250XzNbaWQqMisxXSAhPSBiYWNrXzNbaWQqMl0pewoJCWdbaWRdID0gZ1tpZCoyXSArIGdbaWQqMiArIDEgXTsgCgl9CgllbHNlIHsKCQlnW2lkXSA9IGdbaWQqMl0gKyBnW2lkKjIgKyAxXSAtIDEgOwoJfQoJZnJvbnRfM1tpZF0gPSBmcm9udF8zW2lkKjJdIDsKCWJhY2tfM1tpZF0gPSBiYWNrXzNbaWQqMisxXSA7Cn0Kdm9pZCBmaXhfc3ViMyAoIGludCBpZCAsIGludCBsICwgaW50ICByKXsKCWlmICggbGF6eV8zW2lkXSA9PSAwICkgcmV0dXJuIDsKCWZyb250XzNbaWRdID0gYmFja18zW2lkXSA9IGxhenlfM1tpZF07CglnW2lkXSA9IDEgIDsKCS8vbW90W2lkXS5wYihsYXp5W2lkXSkgOwoJaWYgKCBsID09IHIpIHsKCQlsYXp5XzNbaWRdID0gMCA7CgkJcmV0dXJuIDsKCX0gCglpZiAoIGwgIT0gciApewoJCWxhenlfM1tpZCoyXSA9IGxhenlfM1tpZCoyKzFdID0gbGF6eV8zW2lkXSA7Cgl9CglsYXp5XzNbaWRdID0gMCA7Cn0Kdm9pZCB1cGRhdGVfc3ViMyggaW50IGlkICwgaW50IGwgLCBpbnQgciAsIGludCB1ICwgaW50IHYgLCBpbnQgeCApewoJZml4X3N1YjMoaWQgLCBsICwgciApOwoJaWYgKCB1ID4gciB8fCB2IDwgbCApIHJldHVybiA7CglpZiAoIHUgPD0gbCAmJiByIDw9IHYgKXsKCQlsYXp5XzNbaWRdID0geCA7CgkJZml4X3N1YjMoaWQgLCBsICwgciApOwoJCXJldHVybiA7Cgl9CglpbnQgbSA9ICggbCArIHIgKSA+PiAxIDsKCXVwZGF0ZV9zdWIzKCBpZCAqIDIgLCBsICwgbSAsIHUgLCB2ICwgeCk7Cgl1cGRhdGVfc3ViMyggaWQgKiAyICsgMSAsIG0gKyAxICwgciAsIHUgLCB2ICwgeCApOwoJaWYgKGZyb250XzNbaWQqMisxXSAhPSBiYWNrXzNbaWQqMl0pewoJCWdbaWRdID0gZ1tpZCoyXSArIGdbaWQqMiArIDEgXTsgCgl9CgllbHNlIHsKCQlnW2lkXSA9IGdbaWQqMl0gKyBnW2lkKjIgKyAxXSAtIDEgOwoJfQoJZnJvbnRfM1tpZF0gPSBmcm9udF8zW2lkKjJdIDsKCWJhY2tfM1tpZF0gPSBiYWNrXzNbaWQqMisxXSA7Cn0Kc3RydWN0IHNhY3NvewoJaW50IGIgLCBmICwgdmFsIDsKfSA7CnNhY3NvIGdldF8zKCBpbnQgaWQgLCBpbnQgbCAsIGludCByICwgaW50IHUgLCBpbnQgdiApewoJZml4X3N1YjMgKCBpZCAsIGwgLCByICk7CglpZiAoIHUgPiByIHx8IHYgPCBsICkgcmV0dXJuIHsgMCAsIDAgLCAwIH0gOwoJaWYgKCB1IDw9IGwgJiYgciA8PSB2ICl7CgkJc2Fjc28gYyA7CgkJYy5iID0gYmFja18zW2lkXSA7CgkJYy5mID0gZnJvbnRfM1tpZF0gOwoJCWMudmFsID0gZ1tpZF0gOyAKCQlyZXR1cm4gYyA7Cgl9CglpbnQgbSA9ICggbCArIHIgKT4+IDE7IAoJc2Fjc28gY19pZDIgPSBnZXRfMyhpZCoyICwgbCAsIG0gLCB1ICwgdiApOwoJc2Fjc28gY19pZDIxID0gZ2V0XzMoaWQgKiAyICsgMSAsIG0gKyAxICwgciAsIHUgLCB2ICkgOwoJc2Fjc28gYW5zIDsKCWlmICggY19pZDIudmFsID09IDAgJiYgIGNfaWQyMS52YWwgPT0gMCApIHJldHVybiB7IDAgLCAwICwgMCB9IDsKCWlmICggY19pZDIudmFsID09IDAgKSByZXR1cm4gY19pZDIxIDsKCWVsc2UgaWYgKCBjX2lkMjEudmFsID09IDAgKSByZXR1cm4gY19pZDIgOwoJaWYgKGNfaWQyLmIgPT0gY19pZDIxLmYpewoJCWFucy52YWwgPSBjX2lkMi52YWwgKyBjX2lkMjEudmFsIC0xIDsKCX0KCWVsc2UgYW5zLnZhbCA9IGNfaWQyLnZhbCArIGNfaWQyMS52YWwgOwoJYW5zLmYgPSBjX2lkMi5mOwoJYW5zLmIgPSBjX2lkMjEuYiA7CglyZXR1cm4gYW5zIDsKfQp2b2lkIHN1YjMoKSB7CglidWlsZF9zdWIzKCAxICwgMSAsIG4gKTsKCWZvciAoaW50IGkgPSAxIDsgaSA8PSBxIDsgaSArKyApewoJCWlmICggYVtpXS53dCA9PSAnZycpewoJCQlzYWNzbyBjID0gZ2V0XzMoIDEgLCAxICwgbiAsIGFbaV0ubCAsIGFbaV0ucik7CgkJCWNvdXQgPDwgYy52YWwgPDwgJ1xuJzsKCQl9CgkJZWxzZSB1cGRhdGVfc3ViMygxICwxICAsIG4gLCBhW2ldLmwgLCBhW2ldLnIgLCBhW2ldLnd0ICk7Cgl9Cn0Kdm9pZCBzb2x2ZSgpewoJY2luID4+IG4gPj4gcSA+PiBjYzEyMyA7Cglmb3IgKGludCBpID0gMSA7IGkgPD0gbiA7IGkgKysgKQoJCXNbaV0gPSBjYzEyM1tpLTFdIDsKCWZvciAoaW50IGkgPSAxIDsgaSA8PSBxIDsgaSArKyl7CgkJc3RyIHd0YyA7IGNpbiA+PiB3dGMgOwoJCWFbaV0ud3QgPSB3dGNbMF0gOwoJCWNpbiA+PiBhW2ldLmwgPj4gYVtpXS5yIDsKCQkvL2lmICggYVtpXS53dCA9PSAnZycpIGNoZWNrX3N1YjIgPSAwIDsKCQlpZiAoYVtpXS53dCA9PSAnYycpIHsKCQkJY2hlY2tfc3ViMiA9IDAgOwoJCQljaW4gPj4gYVtpXS53dCA7CgkJfQoJfQoJaWYgKGNoZWNrX3N1YjIpIHN1YjIoKTsKIAllbHNlIGlmICggbiA8PSAxMDAwIClzdWIxKCkgOwogCWVsc2Ugc3ViMygpIDsKfQpfbmhhdG1pbmh7CmZyZW9wZW4oInNhY3NvIik7Cmlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CmNpbi50aWUoMCk7IGNvdXQudGllKDApOwpzb2x2ZSgpOwpjZXJyIDw8ICdcbicgPDwgIlRpbWUgZWxhcHNlZCAiIDw8IFRJTUUgPDwgInMuXG4iOwpyZXR1cm4gKDApOwp9