98232024-03-08 18:41:44szilSokszorozott maximumokcpp17Time limit exceeded 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;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted28ms39396 KiB
subtask211/11
2Accepted43ms39672 KiB
3Accepted39ms39720 KiB
4Accepted41ms41552 KiB
5Accepted43ms43520 KiB
6Accepted28ms40324 KiB
7Accepted43ms41448 KiB
subtask30/13
8Accepted43ms40444 KiB
9Accepted41ms40616 KiB
10Accepted48ms42512 KiB
11Time limit exceeded2.068s105568 KiB
12Time limit exceeded2.085s198824 KiB
13Time limit exceeded2.079s198936 KiB
subtask419/19
14Accepted716ms324120 KiB
15Accepted722ms359944 KiB
16Accepted996ms377492 KiB
17Accepted1.039s395236 KiB
18Accepted833ms395252 KiB
subtask525/25
19Accepted483ms129880 KiB
20Accepted512ms112440 KiB
21Accepted441ms112428 KiB
22Accepted437ms128816 KiB
23Accepted382ms82516 KiB
subtask60/32
24Time limit exceeded2.075s199800 KiB
25Time limit exceeded2.071s199748 KiB
26Accepted1.562s325032 KiB
27Accepted1.661s360792 KiB
28Accepted1.945s378188 KiB
29Time limit exceeded2.065s199076 KiB
30Accepted1.82s348388 KiB