// ROOT : DRAGON3012009 : WA in Real Life
#include <bits/stdc++.h>
#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 compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define M 1000000007
#define MAXN 300003
#define INF (1ll<<60 )
#define NAME "post"
#define LOG 63
#define BLOCK 475
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;

ll n, m, q ;
ll a[MAXN] ;
ll pref[MAXN ] ;
ll b[MAXN] ;
ll res[MAXN ] ;
ll cnt[MAXN ] ;
ll ans ;
vector<ll> cpr ;
unordered_map<ll,ll> mp ;
vector<ll> pos[MAXN ] ;

struct Query {
    ll l, r, id ;
    bool operator < (const Query & other ) const {
        ll A = l / BLOCK, B = other.l / BLOCK ;
        if(A == B ) return (A % 2 == 1 ? r > other.r : r < other.r ) ;
        return A < B ;
    }
} ;

vector<Query> que ;
ll rands(ll l, ll r ) {
    return rand() % (r - l + 1 ) + l ;
}
ll random_50 () {
    ll res = 0 ;
    FOR(i, 0, LOG ) if(rands(0, 1 )) res += (1LL << i) ;
    if(mp[res]) return random_50() ;
    else {
        mp[res] = true ;
        return res ;
    }
}

void add(ll a ) {
    ans += cnt[a] ;
    cnt[a] ++ ;
}

void del(ll a ) {
    cnt[a] -- ;
    ans -= cnt[a] ;
}

ll ID(ll value ) {
    return lower_bound(cpr.begin(), cpr.end(), value  ) - cpr.begin() + 1 ;
}

void init() {
    cin >> n >> q ;
    FOR(i, 1, n ) {
        cin >> a[i] ;
        cpr.push_back(a[i]);
    }
    FOR(i, 1, q ) {
        ll l, r ;
        cin >> l >> r ;
        que.push_back({l, r, i }) ;
    }
}

void solve() {

    compare(cpr ) ;
    FOR(i, 1, n ) a[i] = ID(a[i] ) ;
    FOR(i, 1, n ) b[i] = random_50() ;
//    FOR(i , 1 , n ) cout << b[i] << " " ; cout << " ran " << el ;
    FOR(i, 1, n ) pos[a[i]].push_back(b[i]) ;

    FOR(i, 1,(int) cpr.size() ) {
        ll p = rands(1, pos[i].size() ) ;
        p -- ;
        ll cur = 0 ;
        for(ll j = 0 ; j < pos[i].size() ; j ++ ) if(j != p ) cur ^= pos[i][j] ;
        pos[i][p] = cur ;
    }

    FOR(i, 1,(int) cpr.size() ) random_shuffle(pos[i].begin(), pos[i].end() ) ;

    FOR(i, 1, n ) {
        ll t = a[i] ;
        a[i] = pos[t].back() ;
        pos[t].pop_back() ;
    }
    cpr.clear() ;

    FOR(i, 1, n ) {
        pref[i] = pref[i - 1 ] ^ a[i] ;
    }

//        FOR(i , 0 , n ) cout << pref[i] << " " ; cout << " pref " << el ;


//    FOR(i , 1 , n ) cout << a[i] << " " ;
    FOR(i, 0, n ) cpr.push_back(pref[i]) ;
    compare(cpr ) ;
    FOR(i, 0, n ) pref[i] = ID(pref[i]) ;

//    cnt[ID(0) ] ++ ;
    sort(que.begin(), que.end() ) ;
//    FOR(i , 0 , n ) cout << pref[i] << " " ; cout << " pref " << el ;
    ll l = 0, r = -1 ;

    for(auto [l1, r1, id ] : que ) {
        l1 -- ;
        while(r < r1 ) add(pref[++ r ]) ;
        while(l > l1 ) add(pref[-- l ]) ;
        while(l < l1 ) del(pref[l ++ ]) ;
        while(r > r1 ) del(pref[r -- ]) ;
        res[id] = ans ;
    }

    FOR(i, 1, q ) cout << res[i] << el ;
}

_ROOT_ {
     freopen(NAME".inp" , "r" , stdin);
     freopen(NAME".out" , "w", stdout) ;
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    srand(time(nullptr)) ;
    int t = 1; // cin >> t ;
    while(t--) {
        init();
        solve();
    }
    return (0&0);
}
