#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=2000000; int add[maxn],l[maxn],r[maxn],sum[maxn],b[maxn],a[maxn]; int n,m,len,tot,ans; int cop[maxn]; /*void work(int l,int r,int z) { int mid; while(l<=r) { mid=(l+r)>>1; if(cop[mid]<z) { l=mid+1; } else r=mid-1; } ans+=r-l+1; }*/ void worki(int x) { for(int i=l[b[x]];i<=r[b[x]];i++) { cop[i]=a[i]; } sort(cop+l[b[x]],cop+r[b[x]]+1); } int main() { scanf("%d%d",&n,&m); len=sqrt(n); tot=n/len; if(n%len) tot++; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); cop[i]=a[i]; b[i]=(i-1)/len+1; //sum[b[i]]+=a[i]; } for(int i=1;i<=tot;i++) { l[i]=(i-1)*len+1; r[i]=i*len; //sort(cop+l[i]+1,cop+r[i]+1); if(i==tot) r[i]=n; } for(int i=1;i<=tot;i++) { sort(cop+l[i],cop+r[i]+1); } for(int j=1;j<=m;j++) { char s[2]; int x,y,z; scanf("%s",s); if(s[0]=='M') { scanf("%d%d%d",&x,&y,&z); if(b[x]==b[y]) { for(int i=x;i<=y;i++) { a[i]+=z; } worki(x); continue; } for(int i=x;i<=r[b[x]];i++) { a[i]+=z; //sum[b[i]]+=z; //sort(cop+x+1,cop+min(y,r[b[x]])); } for(int i=y;i>=l[b[y]];i--) { a[i]+=z; //sum[b[i]]+=z; //sort(cop+max(x,l[b[y]])+1,cop+y+1); } worki(x);worki(y); for(int i=b[x]+1;i<=b[y]-1;i++) { add[i]+=z; } } else { scanf("%d%d%d",&x,&y,&z); ans=0; if(b[x]==b[y]) { for(int i=x;i<=y;i++) { if(a[i]+add[b[i]]>=z) ans++; } printf("%d ",ans); continue; } for(int i=x;i<=r[b[x]];i++) { if(a[i]+add[b[i]]>=z) ans++; } for(int i=y;j>=l[b[y]];i--) { if(a[i]+add[b[i]]>=z) ans++; } //work(x,min(y,r[b[x]]),z); //work(max(x,l[b[y]]),y,z); for(int i=b[x]+1;i<=b[y]-1;i++) { int d=lower_bound(a+l[i],a+r[i]+1,z-add[i])-a; ans+=r[i]-d+1; //work(l[i],r[i],z); } printf("%d ",ans); } } return 0; }
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=1000000; struct node { int l,r,id; }qu[maxn]; int n,q,a[maxn]; int len,tot,b[maxn]; int cnt[maxn],ll=1,rr=0,now=0; bool cmp(node x,node y) { if(b[x.l]==b[y.l]) return x.r<y.r; else return x.l<y.l; } /*int cmp(node x,node y) { return (b[x.l] ^ b[y.l]) ? b[x.l] < b[y.l] : ((b[x.l] & 1) ? x.r < y.r : x.r > y.r); }*/ void add(int pos) { if(!cnt[a[pos]]) ++now; ++cnt[a[pos]]; } void del(int pos) { --cnt[a[pos]]; if(!cnt[a[pos]]) now--; } int ans[maxn]; int main() { scanf("%d",&n); len=sqrt(n); tot=n/len; if(n%len) tot++; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=(i-1)/len+1; } scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d",&qu[i].l,&qu[i].r);
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=200000; int n,m; int a[maxn],l[maxn],r[maxn],b[maxn],sum[maxn]; int len,tot,add[maxn]; int main() { scanf("%d%d",&n,&m); len=sqrt(n);//区间长度 tot=n/len;//区间个数 if(n%len) tot++; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=(i-1)/len+1;//隶属哪一块 sum[b[i]]+=a[i];//区间总和 } for(int i=1;i<=tot;i++) { l[i]=(i-1)*len+1;//区间左右端点 r[i]=i*len; } for(int i=1;i<=m;i++) { int q,x,y,k; scanf("%d",&q); if(q==1) { scanf("%d%d%d",&x,&y,&k); for(int j=x;j<=min(y,r[b[x]]);j++) { a[j]+=k; sum[b[j]]+=k; } for(int j=y;j>=max(x,l[b[y]]);j--) { a[j]+=k; sum[b[j]]+=k; } for(int j=b[x]+1;j<=b[y]-1;j++) { add[j]+=k; } } else if(q==2) { long long ans=0; scanf("%d%d",&x,&y); for(int j=x;j<=min(y,r[b[x]]);j++) { ans+=a[j]+add[b[j]]; } for(int j=y;j>=max(x,l[b[y]]);j--) { ans+=a[j]+add[b[j]]; } for(int j=b[x]+1;j<=b[y]-1;j++) { ans+=sum[j]+add[j]*(r[j]-l[j]+1); } if(b[x]==b[y]) { ans-=a[x]+a[y]+add[b[x]]+add[b[y]]; } printf("%lld ",ans); } } return 0; }
qu[i].id=i; } sort(qu+1,qu+q+1,cmp); for(int i=1;i<=q;i++) { int ql=qu[i].l; int qr=qu[i].r; while(ll<ql) del(ll++); while(ll>ql) add(--ll); while(rr>qr) del(rr--); while(rr<qr) add(++rr); ans[qu[i].id]=now; } for(int i=1;i<=q;i++) printf("%d ",ans[i]); return 0; }