98232024-03-08 18:41:44szilSokszorozott maximumokcpp17Időlimit túllépés 55/1002.085s395252 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 k) {
    if (k == 0) return 1;
    if (k & 1) return (a*bpow(a, k-1))%MOD;
    ll x = bpow(a, k/2);
    return (x*x)%MOD;
}

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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva28ms39396 KiB
subtask211/11
2Elfogadva43ms39672 KiB
3Elfogadva39ms39720 KiB
4Elfogadva41ms41552 KiB
5Elfogadva43ms43520 KiB
6Elfogadva28ms40324 KiB
7Elfogadva43ms41448 KiB
subtask30/13
8Elfogadva43ms40444 KiB
9Elfogadva41ms40616 KiB
10Elfogadva48ms42512 KiB
11Időlimit túllépés2.068s105568 KiB
12Időlimit túllépés2.085s198824 KiB
13Időlimit túllépés2.079s198936 KiB
subtask419/19
14Elfogadva716ms324120 KiB
15Elfogadva722ms359944 KiB
16Elfogadva996ms377492 KiB
17Elfogadva1.039s395236 KiB
18Elfogadva833ms395252 KiB
subtask525/25
19Elfogadva483ms129880 KiB
20Elfogadva512ms112440 KiB
21Elfogadva441ms112428 KiB
22Elfogadva437ms128816 KiB
23Elfogadva382ms82516 KiB
subtask60/32
24Időlimit túllépés2.075s199800 KiB
25Időlimit túllépés2.071s199748 KiB
26Elfogadva1.562s325032 KiB
27Elfogadva1.661s360792 KiB
28Elfogadva1.945s378188 KiB
29Időlimit túllépés2.065s199076 KiB
30Elfogadva1.82s348388 KiB