Submission #1292277

#TimeUsernameProblemLanguageResultExecution timeMemory
1292277AliMark71Secret (JOI14_secret)C++20
0 / 100
327 ms4536 KiB
//
//  main.cpp
//  EliteCamp 2025
//
//  Created by Ali AlSalman on 14/11/2025.
//

#include <bits/stdc++.h>


//#define INTERACTIVE
//#define TESTCASES
//#define SPOJ_BULLSCHEI__SZ__E__KIJETESANPAKALU__

template<typename T>
using vec = std::vector<T>;
using namespace std;

int Secret(int x, int y);

struct segtree {
    struct node {
        int sum;
    
        static node merge(const node& lhs, const node& rhs) {
            return { Secret(lhs.sum, rhs.sum) };
        }
    };
    
    vec<optional<node>> _data;
    int _offset;
    
    segtree() {}
    segtree(int n, int a[]) {
        if (__builtin_popcount(n) == 1) _offset = n;
        else _offset = (1<<(32 - __builtin_clz(n)));
        
        _data.resize(2 * _offset);
        
        for (int i = 0; i < n; i++)
            _data[i + _offset] = { a[i] };
        
        for (int i = _offset - 1; i; i--)
            _data[i] = node::merge(_data[2 * i].value(), _data[2 * i + 1].value());
    }
    
    optional<node> _query(int v, int l, int r, int ql, int qr) {
        if (ql <= l &&  r <= qr) return _data[v];
        else if (r <= ql || qr <= l) return nullopt;
        else {
            int mid = (l + r) / 2;
            auto lhs = _query(2 * v,     l, mid, ql, qr);
            auto rhs = _query(2 * v + 1, mid, r, ql, qr);
            
            if (!lhs.has_value()) return rhs;
            if (!rhs.has_value()) return lhs;
            return node::merge(lhs.value(), rhs.value());
        }
    }
    
    void set(int i, node n) {
        i += _offset;
        _data[i] = n;
        for (i /= 2; i; i /= 2)
            _data[i] = node::merge(_data[2 * i].value(), _data[2 * i + 1].value());
    }
    
    node query(int l, int r) {
        l += _offset; r += _offset;
        return _query(1, _offset, 2 * _offset, l, r).value();
    }
};

segtree st;

void Init(int n, int a[]) {
    st = segtree(n, a);
}

int Query(int l, int r) {
    return st.query(l, ++r).sum;
}

//int main() {
//#ifndef INTERACTIVE
//    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
//#endif
//    
//    int t = 1;
//#ifdef TESTCASES
//    cin>>t;
//#endif
//    
//    for (int i = t; i--;) {
//#if defined(TESTCASES) && defined(SPOJ_BULLSCHEI__SZ__E__KIJETESANPAKALU__)
//        cout<<"Case "<<t-i<<":\n";
//#elif defined(SPOJ_BULLSCHEI__SZ__E__KIJETESANPAKALU__)
//#warning SPOJ_BULLSCHEIßE__KIJETESANPAKALU__ without TESTCASES doesn't ducking make sense!
//#endif
//        solve();
//    }
//    return 0;
//}
#Verdict Execution timeMemoryGrader output
Fetching results...