Submission #1297297

#TimeUsernameProblemLanguageResultExecution timeMemory
1297297tabRelativnost (COCI15_relativnost)C++20
56 / 140
2925 ms58776 KiB
#include "bits/stdc++.h"
using namespace std;
#define intt long long
#define fi first
#define se second

const intt mxN = 1e5 + 5;
const intt LG = 20;
const intt inf = 1e18;  
const intt mod = 10007;

vector<vector<intt>> seg;
vector<intt> a(mxN), b(mxN);
intt n, c, q;

void build(intt node, intt l, intt r) {
    if(l == r) {
        seg[0][node] = b[l] % mod;
        seg[1][node] = a[l] % mod;
        return;
    }
    intt mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
\
    for(intt sol = 0; sol <= c; sol++) {
        for(intt sag = 0; sag <= c; sag++) {
            intt cnt = min(sol + sag, c);
            seg[cnt][node] += ((seg[sol][node * 2] * seg[sag][node * 2 + 1]) % mod);
            seg[cnt][node] %= mod;
            // cout << node << " " << cnt << ": " << seg[cnt][node] << endl;
        }
    }
}

void update(intt node, intt l, intt r, intt pos, intt aval, intt bval) {
    if(l == r) {
        seg[0][node] = bval % mod;
        seg[1][node] = aval % mod;
        return;
    }
    intt mid = (l + r) / 2;
    if(pos <= mid) {
        update(node * 2, l, mid, pos, aval, bval);
    } else {
        update(node * 2 + 1, mid + 1, r, pos, aval, bval);
    }

    for(intt C = 0; C <= c; C++) seg[C][node]=0;

    for(intt sol = 0; sol <= c; sol++) {
        for(intt sag = 0; sag <= c; sag++) {
            intt cnt = min(sol + sag, c);
            seg[cnt][node] += ((seg[sol][node * 2] * seg[sag][node * 2 + 1]) % mod);
            seg[cnt][node] %= mod;
        }
    }
}

intt get(intt node, intt l, intt r, intt ql, intt qr) {
    if(ql > r || qr < l || ql > qr) return 0ll;
    if(ql <= l && r <= qr) {
        return seg[c][node] % mod;
    }
    intt mid = (l + r) / 2;
    return get(node * 2, l, mid, ql, qr) + get(node * 2 + 1, mid + 1, r, ql, qr);
}

void _() {
    cin >> n >> c;
    seg.assign(c + 1, vector<intt>(4 * n + 1, 0ll));
    a.resize(n+1); b.resize(n + 1);
    for(intt i = 1; i <= n; i++) cin >> a[i];
    for(intt i = 1; i <= n; i++) cin >> b[i];
    build(1, 1, n);

    cin >> q;
    while(q--) {
        intt idx, av, bv;
        cin >> idx >> av >> bv;
        update(1, 1, n, idx, av, bv);
        cout << get(1, 1, n, 1, n) << endl;
    }
}   

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    intt t = 1, buu = 1;
    // cin >> t;
    while(t--){
        // cout << "Case #" << buu++ << ": ";
        _();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...