98242024-03-08 18:44:22szilSokszorozott maximumokcpp17Accepted 100/1001.491s395316 KiB
#include <bits/stdc++.h>

using ll = long long;
using namespace std;

const int MAXN = 200'001;
const ll MOD = 1e9+7;

ll bpow(ll a, ll b) {
    ll res = 1;
    while (b > 0) {
        if (b & 1) {
            res = (res * a) % MOD;
        }
        a = (a * a) % MOD;
        b >>= 1;
    }
    return res;
}

ll inv(ll a) {
    return bpow(a, MOD-2);
}

struct Node {
    Node *l, *r;
    int val = 0;
    ll mult = 1;

    Node(int x, ll y) : val(x), mult(y) {}

    Node(Node *a, Node *b) : l(a), r(b) {
        if (a) {
            val += a->val;
            mult *= a->mult;
            mult %= MOD;
        }
        if (b) {
            val += b->val;
            mult *= b->mult;
            mult %= MOD;
        }
    }
};

Node *build(int tl, int tr) {
    if (tl == tr) {
        return new Node(0, 1);
    } else {
        int tm = (tl + tr) / 2;
        return new Node(build(tl, tm), build(tm+1, tr));
    }
}

Node *upd(Node *v, int tl, int tr, int pos) {
    if (tl == tr) {
        return new Node(v->val+1, (v->mult*tl)%MOD);
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm) {
            return new Node(upd(v->l, tl, tm, pos), v->r);
        } else {
            return new Node(v->l, upd(v->r, tm+1, tr, pos));
        }
    }
}

ll qry(Node *v, Node *u, int tl, int tr, int k) {
    if (tl == tr) {
        return bpow(tl, k);
    } else {
        int tm = (tl + tr) / 2;
        int to_right = v->r->val - u->r->val;
        if (k <= to_right) {
            return qry(v->r, u->r, tm+1, tr, k);
        } else {
            return (((v->r->mult*inv(u->r->mult))%MOD)*qry(v->l, u->l, tl, tm, k-to_right))%MOD;
        }
    }
}

void solve() {
    int n, q; cin >> n >> q;
    vector<Node *> roots = {build(1, MAXN)};
    for (int i = 1; i <= n; i++) {
        int x; cin >> x;
        roots.emplace_back(upd(roots.back(), 1, MAXN, x));
    }
    while (q--) {
        int l, r, k; cin >> l >> r >> k;
        l++; r++;
        cout << qry(roots[r], roots[l-1], 1, MAXN, k) << "\n";
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted28ms39404 KiB
subtask211/11
2Accepted34ms39816 KiB
3Accepted32ms40080 KiB
4Accepted34ms41620 KiB
5Accepted37ms43668 KiB
6Accepted28ms40248 KiB
7Accepted34ms41328 KiB
subtask313/13
8Accepted34ms40520 KiB
9Accepted32ms40664 KiB
10Accepted35ms42324 KiB
11Accepted1.029s208416 KiB
12Accepted1.284s394172 KiB
13Accepted1.309s394392 KiB
subtask419/19
14Accepted593ms323644 KiB
15Accepted637ms359420 KiB
16Accepted857ms377128 KiB
17Accepted741ms394708 KiB
18Accepted718ms394672 KiB
subtask525/25
19Accepted423ms129488 KiB
20Accepted310ms111996 KiB
21Accepted381ms112116 KiB
22Accepted279ms128648 KiB
23Accepted252ms82152 KiB
subtask632/32
24Accepted1.437s395316 KiB
25Accepted1.424s395232 KiB
26Accepted1.131s324428 KiB
27Accepted1.2s360180 KiB
28Accepted1.396s377876 KiB
29Accepted1.491s394408 KiB
30Accepted1.307s347856 KiB