95842024-02-23 12:24:19gortomiSokszorozott maximumokcpp17Időlimit túllépés 36/1002.085s523308 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 1e9 + 7;
struct node
{
    ll db, mul, l, r, m;
    node *lc, *rc;
    node(int il, int ir)
    {
        l = il;
        r = ir;
        m = (l + r) / 2;
        db = 0;
        mul = 1;
        lc = nullptr;
        rc = nullptr;
    }
    node * upd(int x, int val)
    {
        node *cur = new node(l, r);
        cur -> db = db + 1;
        cur -> mul = (mul * val) % MOD;
        cur -> lc = lc;
        cur -> rc = rc;
        if(l == r) return cur;
        if(x <= m) cur -> lc = lc -> upd(x, val);
        else cur -> rc = rc -> upd(x, val);
        return cur;
    }
    int sum(int tl, int tr)
    {
        if(tl > tr) return 0;
        if(tl == l && tr == r) return db;
        int m = (l + r) / 2;
        return lc -> sum(tl, min(tr, m)) + rc -> sum(max(tl, m + 1), tr);
    }
    ll sig(int tl, int tr)
    {
        if(tl > tr) return 1;
        if(tl == l && tr == r) return mul;
        int m = (l + r) / 2;
        return (lc -> sig(tl, min(tr, m)) * rc -> sig(max(tl, m + 1), tr)) % MOD;
    }
};
node* build(int il, int ir)
{
    node *cur = new node(il, ir);
    if(il == ir) return cur;
    cur -> lc = build(cur -> l, cur -> m);
    cur -> rc = build(cur -> m + 1, cur -> r);
    return cur;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    vector<pair<int, int> > a(n);
    vector<node*> root(n + 1);
    root[0] = build(0, n - 1);
    for(int i = 0; i < n; i++)
    {
        cin >> a[i].first;
        a[i].second = i;
    }
    sort(a.rbegin(), a.rend());
    for(int i = 0; i < n; i++)
    {
        root[i + 1] = root[i] -> upd(a[i].second, a[i].first);
    }
    while(q--)
    {
        int x, y, k;
        cin >> x >> y >> k;
        int l = 0, r = n + 1;
        while(l + 1 != r)
        {
            int m = (l + r) / 2;
            if(root[m] -> sum(x, y) <= k) l = m;
            else r = m;
        }
        cout << root[l] -> sig(x, y) << "\n";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1956 KiB
subtask211/11
2Elfogadva4ms2328 KiB
3Elfogadva4ms2676 KiB
4Elfogadva8ms4396 KiB
5Elfogadva12ms6456 KiB
6Elfogadva3ms3440 KiB
7Elfogadva8ms4416 KiB
subtask30/13
8Elfogadva4ms3784 KiB
9Elfogadva4ms3900 KiB
10Elfogadva8ms5512 KiB
11Időlimit túllépés2.015s239488 KiB
12Futási hiba500ms523308 KiB
13Futási hiba500ms523200 KiB
subtask40/19
14Időlimit túllépés2.066s209648 KiB
15Időlimit túllépés2.085s237784 KiB
16Időlimit túllépés2.085s251520 KiB
17Futási hiba500ms522760 KiB
18Futási hiba500ms522744 KiB
subtask525/25
19Elfogadva801ms122668 KiB
20Elfogadva713ms97720 KiB
21Elfogadva702ms97560 KiB
22Elfogadva626ms120892 KiB
23Elfogadva514ms55572 KiB
subtask60/32
24Futási hiba614ms522532 KiB
25Futási hiba512ms522504 KiB
26Időlimit túllépés2.078s210256 KiB
27Időlimit túllépés2.078s238240 KiB
28Időlimit túllépés2.076s252212 KiB
29Futási hiba609ms522240 KiB
30Időlimit túllépés2.081s228620 KiB