提交时间:2023-08-16 11:30:47

运行 ID: 98576

#include <bits/stdc++.h> using namespace std; #define int long long inline int Read() { int x = 0 , f = 1; char c = getchar(); for( ; c < '0' || c > '9' ; c = getchar() ) f ^= ( c == '-' ); for( ; c >= '0' && c <= '9' ; c = getchar() ) x = ( x << 3 ) + ( x << 1 ) + ( c ^ 48 ); return f ? x : -x; } const int _ = 2e5 + 5; struct Node { int l , r; mutable int v; Node( int l , int r = 0 , int v = 0 ) : l(l),r(r),v(v) {} bool operator < ( const Node &x ) const { return l < x.l; } }; int n , m; int a[_]; set< Node > s; set< Node > :: iterator Split( int pos ) { set< Node > :: iterator it = s.lower_bound( Node( pos ) ); if( it != s.end() && it -> l == pos ) return it; it--; if( it -> r < pos ) return s.end(); int l = it -> l , r = it -> r , v = it -> v; s.erase( it ); s.insert( Node( l , pos - 1 , v ) ); return s.insert( Node( pos , r , v ) ).first; } void Assign( int l , int r , int x ) { set< Node > :: iterator itr = Split( r + 1 ) , itl = Split( l ); s.erase( itl , itr ); s.insert( Node( l , r , x ) ); } int Query( int l , int r , int v ) { set< Node > :: iterator itr = Split( r + 1 ) , itl = Split( l ); int ans = 0; for( set< Node > :: iterator it = itl ; it != itr ; it++ ) { ans += ( (*it).v == v ) * ( (*it).r - (*it).l + 1 ); } return ans; } signed main() { n = Read() , m = Read(); for( int i = 1 ; i <= n ; i++ ) { a[ i ] = Read(); s.insert( Node( i , i , a[ i ] ) ); } for( int i = 1 ; i <= m ; i++ ) { int l = Read() , r = Read() , c = Read(); printf( "%lld\n" , Query( l , r , c ) ); Assign( l , r , c ); } return 0; }