voidbuild( int n, int val[] ){ base = 1; while( base < n ) base <<= 1; for( int i = 1; i <= n; ++ i ) { Node &cur = tr[base + i - 1]; cur.cnt0 = ( val[i] == 0 ); cur.cnt1 = ( val[i] == 1 ); cur.lis = cur.lnds = 1; } for( int i = base - 1; i >= 1; -- i ) { tr[i] = merge( tr[i << 1], tr[i << 1 | 1] ); } }
Node ask( int l, int r ){ l += base - 1, r += base - 1; Node L = { }, R = { }; while( l <= r ) { if( l & 1 ) { L = merge( L, tr[l] ); l ++; } if( !( r & 1 ) ) { R = merge( tr[r], R ); r --; } l >>= 1, r >>= 1; } returnmerge( L, R ); } /* ======================================== */ } seg;
int a[maxn];
voidsolve( ){ int n = read( ), m = read( ); for( int i = 1; i <= n; ++ i ) a[i] = read( );
seg.build( n, a );
for( int i = 1; i <= m; ++ i ) { int t = read( ), l = read( ), r = read( ); if( t == 1 ) printf( "%d\n", seg.ask( l, r ).lnds ); elseprintf( "%d\n", seg.ask( l, r ).lis ); } }