提交时间:2023-08-16 12:20:37

运行 ID: 98676

#include<bits/stdc++.h> using namespace std; struct node{ int l,r;long long val; node(){l=r=0;val=0;} node(int _l,int _r){l=_l;r=_r;val=0;} node(int _l,int _r,long long _val){l=_l;r=_r;val=_val;} bool operator<(node x)const{ if(r<x.l)return true; return false; } }; set<node> odt; set<node>::iterator split(int pos){ return odt.lower_bound(node(pos,pos)); } void assign(int l,int r,long long x){ set<node>::iterator tl=split(l); int tmpl,tmpr; long long tmpval; if(tl->l!=l){ tmpl=tl->l; tmpr=tl->r; tmpval=tl->val; odt.erase(tl); odt.insert(node(tmpl,l-1,tmpval)); tl=odt.insert(node(l,tmpr,tmpval)).first; } set<node>::iterator tr=split(r); if(tr->r!=r){ tmpl=tr->l; tmpr=tr->r; tmpval=tr->val; odt.erase(tr); tr=odt.insert(node(tmpl,r,tmpval)).first; odt.insert(node(r+1,tmpr,tmpval)); } set<node>::iterator tmp; while(tl!=tr){ tmp=tl;tl++; odt.erase(tmp); } odt.erase(tr); odt.insert(node(l,r,x)); } int query(int l,int r,long long x){ set<node>::iterator tl=split(l); set<node>::iterator tr=split(r); if(tl==tr)return (tl->val==x?r-l+1:0); int ans=0; if(tl->val==x)ans+=tl->r-l+1; tl++; while(tl!=tr){ if(tl->val==x)ans+=tl->r-tl->l+1; tl++; } if(tr->val==x)ans+=r-tr->l+1; return ans; } int main(){ int n,m,l,r;long long val; scanf("%d%d",&n,&m); odt.clear(); for(int i=1;i<=n;i++) scanf("%lld",&val),odt.insert(node(i,i,val)); for(int i=1;i<=m;i++){ scanf("%d%d%lld",&l,&r,&val); printf("%d\n",query(l,r,val)); assign(l,r,val); } return 0; }