蒟蒻求助,10pts 只 AC Subtask2,悬赏关注
查看原帖
蒟蒻求助,10pts 只 AC Subtask2,悬赏关注
470960
Yellow_and_Strong楼主2023/3/21 07:56

rt

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int MAXN = 3e5 + 30;
const int MOD = 1e9 + 7;

inline int read()
{
    int x = 0; char ch = getchar();
    while (!isdigit(ch)) ch = getchar();
    while (isdigit(ch)) x = x * 10 + (ch - 48), ch = getchar();
    return x;
}
inline void write (int x)
{
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10);
    putchar (x % 10 + 48);
}

int n, m, a[MAXN];
inline void input()
{
    n = read(), m = read();
    for (register int i = 1; i <= n; ++ i) a[i] = read();
}

int k;
struct Tree { int b, c, d; }T[MAXN << 5]; int lc[MAXN << 5], rc[MAXN << 5], tot, rt[MAXN];
inline void push_up (int cur)
{
    T[cur].b = (T[lc[cur]].b + T[rc[cur]].b) % MOD;
    T[cur].c = (T[lc[cur]].c + T[rc[cur]].c) % MOD;
    T[cur].d = (T[lc[cur]].d + T[rc[cur]].d) % MOD;
}
int build (int l, int r)
{
    int cur = ++ tot;
    if (l == r)
    {
        if (l == 0) return cur;
        else return T[cur].b = 1, T[cur].c = (-a[l] - a[l + 1]) % MOD, T[cur].d = a[l] * a[l + 1] % MOD, cur;
    }
    int mid = l + r >> 1;
    lc[cur] = build(l, mid), rc[cur] = build(mid + 1, r);
    return push_up(cur), cur;
}
inline void init()
{
    sort(a + 1, a + n + 1), k = unique(a + 1, a + n + 1) - a - 1;
    rt[0] = build(0, n);
}

void insert (int pre, int &cur, int l, int r, int pos)
{
    bool flag = false;
    if (cur == pre or !cur) flag = true;
    if (flag) cur = ++ tot, T[cur] = T[pre];
    if (l == r) return (void)(T[cur].b = -T[cur].b, T[cur].c = -T[cur].c, T[cur].d = -T[cur].d);
    if (flag) lc[cur] = lc[pre], rc[cur] = rc[pre];
    int mid = l + r >> 1;
    if (pos <= mid) insert(lc[pre], lc[cur], l, mid, pos);
    else insert(rc[pre], rc[cur], mid + 1, r, pos);
    push_up (cur);
}
int query (int cur, int l, int r, int L, int R, int x)
{
    if (L <= l and r <= R) return (T[cur].b * x % MOD * x + T[cur].c * x + T[cur].d) % MOD;
    int mid = l + r >> 1, res = 0;
    if (lc[cur] and L <= mid) res = query(lc[cur], l, mid, L, R, x);
    if (rc[cur] and R > mid) res += query(rc[cur], mid + 1, r, L, R, x);
    return res % MOD;
}
inline void work()
{
    for (register int i = 1, pos; i <= k; ++ i)
        insert(rt[i - 1], rt[i], 0, n, ((pos = lower_bound(a + 1, a + k + 1, a[i]) - a - 1 + 1) - 1)), insert(rt[i - 1], rt[i], 0, n, pos);
    int last = 0;
    while (m --)
    {
        int x = read() ^ last, l = read() ^ last, r = read() ^ last;
        int ans = (query(rt[upper_bound(a + 1, a + k + 1, x) - a - 1], 0, n, l, r - 1, x) + MOD) % MOD;
        write(ans), putchar('\n');
        last = ans;
    }
}

signed main()
{
    input();
    init();
    work();
    return 0;
}
2023/3/21 07:56
加载中...