提交时间:2023-12-22 13:21:42

运行 ID: 117123

#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,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; }