1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #include <bits/stdc++.h> #define MAXN 40005 #define MAXM 205 using namespace std; void write(int x) { if(x>9) write(x/10); putchar(x%10+'0'); } inline void Print(int x){ if (x==0){putchar('0');return ;} if (x<0) x=-x,putchar('-'); write(x); putchar('\n'); } inline int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int a[MAXN],id[MAXN],b[MAXN],Size,n,m; int p[MAXM][MAXM]; int pcnt[MAXM][MAXM]; int s[MAXM][MAXN]; int cnt[MAXN],ans; inline void AddBlock(int lb,int rb){ for (register int i=lb;i<=rb;++i){ cnt[a[i]]++; if ((cnt[a[i]]>cnt[ans])||((cnt[a[i]]==cnt[ans])&&(a[i]<ans))){ ans=a[i]; } } } inline void Init(){ for (register int i=1;i<=id[n];++i){ memset(cnt,0,sizeof(cnt)); ans=0; for (register int j=i;j<=id[n];++j){ AddBlock((j-1)*Size+1,min(j*Size,n)); p[i][j]=ans; pcnt[i][j]=cnt[ans]; } } for (register int i=1;i<=id[n];++i){ int lb=(i-1)*Size+1,rb=min(i*Size,n); for (register int j=1;j<=n;++j){ s[i][j]=s[i-1][j]; } for (register int j=lb;j<=rb;++j){ s[i][a[j]]++; } } } inline void discrete(){ for (register int i=1;i<=n;++i){ b[i]=a[i]; } sort(b+1,b+1+n); int tot=unique(b+1,b+1+n)-b-1; for (register int i=1;i<=n;++i){ a[i]=lower_bound(b+1,b+1+tot,a[i])-b; } } inline void UpdateAns(int l,int r,int lid,int rid){ for (register int i=l;i<=r;++i){ cnt[a[i]]++; if (cnt[a[i]]==1) cnt[a[i]]+=s[rid-1][a[i]]-s[lid][a[i]]; if (cnt[a[i]]>cnt[ans]||((cnt[a[i]]==cnt[ans])&&(a[i]<ans))){ ans=a[i]; } } } inline int Query(int l,int r){ int lid=id[l],rid=id[r]; if (lid==rid||lid+1==rid){ ans=0; for (register int i=l;i<=r;++i) cnt[a[i]]=0; AddBlock(l,r); return b[ans]; } int ans1=p[lid+1][rid-1]; int rb=min(lid*Size,n),lb=(rid-1)*Size+1; ans=0; for (register int i=l;i<=rb;++i) cnt[a[i]]=0; for (register int i=lb;i<=r;++i) cnt[a[i]]=0; UpdateAns(l,rb,lid,rid),UpdateAns(lb,r,lid,rid); if (pcnt[lid+1][rid-1]>cnt[ans]) return b[ans1]; else if (pcnt[lid+1][rid-1]==cnt[ans]&&ans1<ans) return b[ans1]; else return b[ans]; } int main(){ n=read(),m=read(); Size=(int)(sqrt(n)); for (register int i=1;i<=n;++i){ a[i]=read(),id[i]=(i-1)/Size+1; } discrete(); Init(); int x=0; while (m--){ int l=(read()+x-1)%n+1,r=(read()+x-1)%n+1; if (l>r) swap(l,r); Print(x=Query(l,r)); } }
|