AC:

· · 题解


#include<bits/stdc++.h>
#define re register
#define ll long long
using namespace std;
inline int rd()
{
    int data = 0;
    char ch = 0;
    ch = getchar();

    while(!isdigit(ch))ch = getchar();

    while(isdigit(ch))data = (data << 1) + (data << 3) + (ch ^ 48), ch = getchar();

    return data;
}
const int N = 5e5 + 5;
int n, q, a[N], dep[N], stk[N], top, first[N], cnt, f[N][20];
ll lastans, s[N][20];
struct edges
{
    int v, nxt;
} e[N];
inline void add(int u, int v)
{
    e[++cnt] = (edges) {v, first[u]}, first[u] = cnt;
}
void dfs(int u)
{
    for(int re i = 1; (1 << i) < dep[u]; ++i)f[u][i] = f[f[u][i - 1]][i - 1], s[u][i] = s[u][i - 1] + s[f[u][i - 1]][i - 1];

    for(int re v, i = first[u]; i; i = e[i].nxt)
    {
        v = e[i].v;

        if(!dep[v])s[v][0] = (ll)(u - v) * a[v], f[v][0] = u, dep[v] = dep[u] + 1, dfs(v);
    }
}
ll ask(int x, int l, ll re ret = 0)
{
    for(int re i = 19; ~i; --i)
        if(f[x][i] && f[x][i] - x <= l)
            ret += s[x][i], l -= (f[x][i] - x), x = f[x][i];

    ret += (ll)l * a[x];
    return ret;
}
signed main()
{
    n = rd(), q = rd();

    for(int re i = 1; i <= n; ++i)a[i] = rd();

    a[n + 1] = INT_MAX;

    for(int re i = 1; i <= n + 1; ++i)
    {
        while(top && a[stk[top]] < a[i])add(i, stk[top--]);

        stk[++top] = i;
    }

    dfs(n + 1);

    while(q--)
    {
        ll re u = rd(), v = rd();
        int re l = 1 + (u ^ lastans) % n, len = 1 + (v ^ (lastans + 1)) % (n - l + 1);
        printf("%lld\n", lastans = ask(l, len));
    }

    exit(0);
}