两个锅
一个是sametag[i]==c 另一个是a[j]不要写成a[i]#include#include #include #include using namespace std;int belong[100100],sametag[100100],n,a[100100],sz,blocknum;void calbe(int n){ for(int i=1;i<=n;i++) belong[i]=(i-1)/sz+1;}void check(int x){ int f=true,num=a[sz*(x-1)+1]; for(int i=sz*(x-1)+1;i<=min(sz*x,n);i++) f&=(num==a[i]); if(f) sametag[x]=num; else sametag[x]=-1;}void pushdown(int x){ if(sametag[x]!=-1){ for(int i=sz*(x-1)+1;i<=min(sz*x,n);i++) a[i]=sametag[x]; }}int query(int l,int r,int c){ int ans=0; int lsx=belong[l]; int rex=belong[r]; pushdown(lsx); for(int i=l;i<=min(lsx*sz,r);i++) ans+=(a[i]==c); if(lsx!=rex){ pushdown(rex); for(int i=(rex-1)*sz+1;i<=r;i++) ans+=(a[i]==c); for(int i=lsx+1;i<=rex-1;i++) if(sametag[i]!=-1&&sametag[i]==c) ans+=sz; else if(sametag[i]==-1) for(int j=(i-1)*sz+1;j<=i*sz;j++) ans+=(a[j]==c); } return ans;}void update(int l,int r,int c){ int lsx=belong[l]; int rex=belong[r]; pushdown(lsx); sametag[lsx]=-1; for(int i=l;i<=min(lsx*sz,r);i++) a[i]=c; check(lsx); if(lsx!=rex){ pushdown(rex); sametag[rex]=-1; for(int i=(rex-1)*sz+1;i<=r;i++) a[i]=c; check(rex); for(int i=lsx+1;i<=rex-1;i++) sametag[i]=c; }}int main(){ // freopen("a1.in","r",stdin); // freopen("test.out","w",stdout); scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); sz=sqrt(n); blocknum=n/sz; if(n%sz) blocknum++; calbe(n); for(int i=1;i<=blocknum;i++) check(i); for(int i=1;i<=n;i++){ int l,r,c; scanf("%d %d %d",&l,&r,&c); printf("%d\n",query(l,r,c)); update(l,r,c); } return 0;}