MO Team Algorithm +map
#include <cstdio>#include<cstring>#include<cmath>#include<map>#include<algorithm>using namespacestd;Const intmaxn=200000+Ten;intn,t,a[maxn],cnt[maxn*Ten],POS[MAXN];structx{intL,r,id;} S[MAXN];intL,r;intANS,F[MAXN];BOOLcmpConstX&a,Constx&b) { if(POS[A.L]==POS[B.L])returna.r<B.R; returnpos[a.l]<POS[B.L];}intMain () { while(~SCANF ("%d",&N)) {scanf ("%d",&t); intsz=sqrt (n); for(intI=1; i<=n; i++) {scanf ("%d",&A[i]); Pos[i]=i/sz; } for(intI=1; i<=t; i++) {scanf ("%d%d",&s[i].l,&S[I].R); S[i].id=i; } sort (S+1, s+1+t,cmp); Map<int,int>m; Ans=0; for(inti=s[1].L; i<=s[1].R; i++) {Ans=ans+m[a[i]-1]+m[a[i]+1]; M[a[i]]++; } f[s[1].id]=Ans; L=s[1].L; R=s[1].R; for(intI=2; i<=t; i++) { while(l<S[I].L) {Ans=ans-m[a[l]-1]-m[a[l]+1]; M[A[L]]--; L++; } while(l>S[I].L) {L--; Ans=ans+m[a[l]-1]+m[a[l]+1]; M[A[L]]++; } while(r>S[I].R) {Ans=ans-m[a[r]-1]-m[a[r]+1]; M[A[R]]--; R--; } while(r<S[I].R) {R++; Ans=ans+m[a[r]-1]+m[a[r]+1]; M[A[R]]++; } F[s[i].id]=Ans; } for(intI=1; i<=t; i++) printf ("%d\n", F[i]); } return 0;}
CSU 1515 Sequence