Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98540 | alex_liu | Old Driver Tree | C++ | 通过 | 100 | 276 MS | 4936 KB | 1081 | 2023-08-16 09:26:49 |
#include<bits/stdc++.h> #define int long long using namespace std; inline int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } int n,m,a[200005],block,bl[200005],tag[200005]; void pushdown(int x){ if(tag[x]^-1){ for(int i=(x-1)*block+1;i<=x*block;i++)a[i]=tag[x]; tag[x]=-1; } } int ans(int l,int r,int c){ pushdown(bl[l]); int ans=0; for(int i=l;i<=min(r,bl[l]*block);i++)ans+=a[i]==c,a[i]=c; if(bl[l]==bl[r])return ans; pushdown(bl[r]); for(int i=(bl[r]-1)*block+1;i<=r;i++)ans+=a[i]==c,a[i]=c; for(int i=bl[l]+1;i<bl[r];i++){ if(tag[i]^-1){ if(tag[i]==c)ans+=block; else tag[i]=c; continue; } tag[i]=c; for(int j=(i-1)*block+1;j<=i*block;j++)ans+=a[j]==c,a[j]=c; } return ans; } signed main(){ n=read(),m=read(),block=sqrt(n); for(int i=1;i<=n;i++)a[i]=read(),bl[i]=(i-1)/block+1,tag[i]=-1; while(m--){ int l=read(),r=read(),c=read(); printf("%lld\n",ans(l,r,c)); } return 0; }