9824 2024. 03. 08 18:44:22 szil Sokszorozott maximumok cpp17 Elfogadva 100/100 1.491s 395316 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;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 28ms 39404 KiB
subtask2 11/11
2 Elfogadva 34ms 39816 KiB
3 Elfogadva 32ms 40080 KiB
4 Elfogadva 34ms 41620 KiB
5 Elfogadva 37ms 43668 KiB
6 Elfogadva 28ms 40248 KiB
7 Elfogadva 34ms 41328 KiB
subtask3 13/13
8 Elfogadva 34ms 40520 KiB
9 Elfogadva 32ms 40664 KiB
10 Elfogadva 35ms 42324 KiB
11 Elfogadva 1.029s 208416 KiB
12 Elfogadva 1.284s 394172 KiB
13 Elfogadva 1.309s 394392 KiB
subtask4 19/19
14 Elfogadva 593ms 323644 KiB
15 Elfogadva 637ms 359420 KiB
16 Elfogadva 857ms 377128 KiB
17 Elfogadva 741ms 394708 KiB
18 Elfogadva 718ms 394672 KiB
subtask5 25/25
19 Elfogadva 423ms 129488 KiB
20 Elfogadva 310ms 111996 KiB
21 Elfogadva 381ms 112116 KiB
22 Elfogadva 279ms 128648 KiB
23 Elfogadva 252ms 82152 KiB
subtask6 32/32
24 Elfogadva 1.437s 395316 KiB
25 Elfogadva 1.424s 395232 KiB
26 Elfogadva 1.131s 324428 KiB
27 Elfogadva 1.2s 360180 KiB
28 Elfogadva 1.396s 377876 KiB
29 Elfogadva 1.491s 394408 KiB
30 Elfogadva 1.307s 347856 KiB