// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll int
#define ld long double
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#pragma GCC optimize("O2")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 300001
#define INF (1ll<<30)
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 311
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n, num_block, last_ans = 0, q    ;
ll arr[MAXN];
ll cnt[MAXN] ;
ll b[MAXN] ;
vector<ll> pos[MAXN] ;
ll mode[MAXN / BLOCK_SIZE][MAXN / BLOCK_SIZE ] ;
//**Struct**//

//**Function**//
template<class X, class Y >
bool minimize(X & x, const Y &y ) {
    return x > y ? x = y, 1:0 ;
}
template<class X, class Y >
bool maximize(X &x, const Y &y ) {
    return x < y ? x = y, 1:0 ;
}
void prepare() {
    FOR(i, 0, num_block) { // cur_block
        memset(cnt, 0, sizeof cnt) ;
        ll ma = 0 ;
        FOR(j,min( i*BLOCK_SIZE,n ), n ) {
            cnt[arr[j]] ++ ;
            maximize(ma, cnt[arr[j]] );
            mode[i][j/BLOCK_SIZE] = ma ;
        }
    }
    memset(cnt, 0, sizeof cnt) ;
}
ll query(ll l, ll r) {
    ll ans = 0 ;
    ll blockL = l / BLOCK_SIZE, blockR = r / BLOCK_SIZE ;
    if(blockL == blockR ) {
        FOR(i, l, r ) cnt[arr[i]] ++, maximize(ans, cnt[arr[i]] ) ;
        FOR(i , l , r) cnt[arr[i]] -- ;
    } else {
        ans = mode[blockL+ 1 ][blockR - 1 ] ;
        for(ll i = l ; i / BLOCK_SIZE == blockL ; i ++ ) {
            if(ans < pos[arr[i]].size()) {
                ll temp = 0 ;
                temp = upper_bound(pos[arr[i]].begin(), pos[arr[i]].end(), r ) - lower_bound(pos[arr[i]].begin(), pos[arr[i]].end(), l ) ;
                maximize(ans, temp) ;
            }
        }
        for(ll i = r ; i / BLOCK_SIZE == blockR ; i -- ) {
            if(ans < pos[arr[i]].size()) {
                ll temp = 0 ;
                temp = upper_bound(pos[arr[i]].begin(), pos[arr[i]].end(), r ) - lower_bound(pos[arr[i]].begin(), pos[arr[i]].end(), l ) ;
                maximize(ans, temp) ;
            }
        }
    }
    return ans ;
}
void init() {
    cin>>n >> q;
    num_block = n / BLOCK_SIZE ;
    FOR(i,1, n) cin >> arr[i] ;
    FOR(i, 1, n) {
        b[i] = pos[arr[i]].size() ;
        pos[arr[i]].push_back(i) ;
    }
        prepare() ;
}

void solve() {
    FOR(i, 1, q) {
        ll x, y ;
        cin >> x >> y ;
        x = (x + last_ans )% n + 1 ;
        y = (y + last_ans )% n + 1 ;
        if(x > y ) swap(x, y) ;
        last_ans = query(x, y) ;
        cout << last_ans << el;
    }
}

__ROOT__ {
//     freopen(NAME".inp" , "r" , stdin);
//     freopen(NAME".out" , "w", stdout) ;
    fast;
    int t =1 ;//    cin >> t;
    while(t-- ) {
        init();
        solve();
    }
}