Submission #1341043

#TimeUsernameProblemLanguageResultExecution timeMemory
1341043trungcanMagija (COCI26_magija)C++20
110 / 110
103 ms20804 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;
const int BASE = 1e6 + 3;
const int MOD = 998244353;

int n, q, f[N], p[N];
int fen[N], ma[N], mi[N];
vector<int> L[N];

void add(int &a, int b){
    a += b;
    if (a >= MOD) a -= MOD;
}

void sub(int &a, int b){
    a -= b;
    if (a < 0) a += MOD;
}

void update(int x, int val){
    for (; x <= n; x += x & -x)
        add(fen[x], val);
}

int get(int l, int r){
    int res = 0, x = r; --l;

    for (; r; r -= r & -r)
        add(res, fen[r]);
    for (; l; l -= l & -l)
        sub(res, fen[l]);

    return (res * 1LL * f[n - x]) % MOD;
}

void mer(int u, int v){
    u = p[u]; v = p[v];
    if (u == v) return;
    if ((int)L[u].size() < (int)L[v].size()) swap(u, v);
    ma[u] = max(ma[u], ma[v]);
    mi[u] = min(mi[u], mi[v]);

    for (int x: L[v]){
        p[x] = u;
        update(x, f[x] * 1LL * ((u - v + MOD) % MOD) % MOD);
        L[u].push_back(x);
    }
    L[v].clear();
}

void DnC(int l, int r, int u, int v){
    if (l == r){
        mer(l, u);
        return;
    }
    if (get(l, r) == get(u, v)) return;

    int mid1 = l + ((r - l) >> 1), mid2 = u + ((v - u) >> 1);
    DnC(l, mid1, u, mid2);
    DnC(mid1 + 1, r, mid2 + 1, v);
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> q; f[0] = 1;
    for (int i = 1; i <= n; ++i) {
        L[p[i] = ma[i] = mi[i] = i].push_back(i);
        f[i] = f[i - 1] * 1LL * BASE % MOD;
        update(i, f[i] * 1LL * i % MOD);
    }

    while (q--){
        int t; cin >> t;
        if (t == 1){
            int x; cin >> x;
            x = p[x];
            cout << mi[x] << " " << ma[x] << "\n";
        } else {
            int l, r, x; cin >> l >> r >> x;
            DnC(l, l + x - 1, r, r + x - 1);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...