提交时间:2023-08-16 14:13:21
运行 ID: 98778
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=2e5+10; struct node{ ll l,r,v; bool operator<(const node &x)const{ return l<x.l; } bool operator>(const node &x)const{ return l>x.l; } }; set<node>s; #define st set<node>::iterator inline st split(ll pos){ st it=s.lower_bound(node{pos,0,0}); if(it!=s.end()&&it->l==pos)return it; it--; if(it->r<pos) return s.end(); ll 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; } inline void assign(ll l,ll r,ll x) { st pr=split(r+1),pl=split(l); s.erase(pl,pr),s.insert((node){l,r,x}); } map<ll,bool>vis; inline ll query(ll l,ll r) { ll ans=0; st qr=split(r+1); st ql=split(l); st k=ql; for(;ql!=qr;ql++) if(!vis[(*ql).v]) ans+=1,vis[(*ql).v]=1; for(;k!=qr;k++)vis[(*k).v]=0; return ans; } inline void read(ll &x){ x=0;bool f=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=1;c=getchar();} while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); if(f)x=-x; } ll n,m; inline void write(ll x){ if(x>9)write(x/10); putchar(x%10+'0'); } int main(){ // freopen("karry5307.in","r",stdin); // freopen("karry5307.out","w",stdout); read(n);read(m); s.insert((node{1,n,0})); for(ll i=1;i<=n;i++){ ll x;read(x); assign(i,i,x); } while(m--){ ll op,l,r,x; read(op);read(l);read(r); if(op==1){ read(x); assign(l,r,x); } else{ write(query(l,r)); putchar('\n'); } } return 0; } /* 维护一个长为 n 的序列 a,有 m 次操作。 1.将区间 [l,r] 的值修改为 x。 2.令集合 p={a_i|l≤i≤r },询问集合 p 内的元素个数。 */