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
| #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <map> #include <vector> #define MAXN 40005 using namespace std;
int n, m, size, num, id, a[MAXN], pos[MAXN], L[MAXN], R[MAXN], ans; int cnt[MAXN], val[MAXN], f[500][500];
map<int, int> mmp; vector<int> vec[MAXN];
void init() { size=sqrt(n), num=n/size; for(int i=1; i<=num; i++) L[i]=(i-1)*size+1, R[i]=i*size; if(R[num]<n) {L[++num]=R[num-1]+1; R[num]=n;} for(int i=1; i<=num; i++) for(int j=L[i]; j<=R[i]; j++) pos[j]=i;
for(int i=1; i<=num; i++) { int maxn=0, ans=0; memset(cnt, 0, sizeof(cnt)); for(int j=L[i]; j<=n; j++) { cnt[a[j]]++; int p=pos[j]; if(cnt[a[j]]>maxn || (cnt[a[j]]==maxn && val[a[j]]<val[ans])) ans=a[j], maxn=cnt[a[j]]; f[i][p]=ans; } } }
int cal(int l, int r, int x) { return upper_bound(vec[x].begin(), vec[x].end(), r)-lower_bound(vec[x].begin(), vec[x].end(), l); }
int query(int l, int r) { int ans=0, maxn=0, x=pos[l], y=pos[r]; if(x==y) { for(int i=l; i<=r; i++) { int t=cal(l, r, a[i]); if(t>maxn || (t==maxn && val[a[i]]<val[ans])) ans=a[i], maxn=t; } } else { ans=f[x+1][y-1]; maxn=cal(l, r, ans); for(int i=l; i<=R[x]; i++) { int t=cal(l, r, a[i]); if(t>maxn || (t==maxn && val[a[i]]<val[ans])) ans=a[i], maxn=t; } for(int i=L[y]; i<=r; i++) { int t=cal(l, r, a[i]); if(t>maxn || (t==maxn && val[a[i]]<val[ans])) ans=a[i], maxn=t; } } return ans; }
int main() { scanf("%d%d", &n, &m); for(int i=1;i<=n;i++) { scanf("%d", &a[i]); if(!mmp[a[i]]) { mmp[a[i]]= ++id; val[id]=a[i]; } a[i]=mmp[a[i]]; vec[a[i]].push_back(i); } init(); for(int i=1; i<=m; i++) { int l, r; scanf("%d%d", &l, &r); l=(l+ans-1)%n+1; r=(r+ans-1)%n+1; if(l>r) swap(l, r); ans=val[query(l, r)]; printf("%d\n", ans); } }
|