답안 #558578

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558578 2022-05-07T14:46:56 Z pokmui9909 Nekameleoni (COCI15_nekameleoni) C++17
140 / 140
2075 ms 56588 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
ll N, K, Q;
const ll INF = 1e18;
struct Node{
    ll ans;
    vector<pair<ll, ll>> L, R;
    Node(){}
    Node(ll _ans, ll _k, ll _p){ans = _ans; L.push_back({1LL << _k, _p}); R.push_back({1LL << _k, _p});}
};
Node f(Node &p, Node &q){
    Node ret; ret.ans = min(p.ans, q.ans);
    for(ll i = p.R.size() - 1, j = 0; i >= 0 && j < q.L.size(); i--){
        while(j < q.L.size() && (p.R[i].first | q.L[j].first) != (1LL << K) - 1) j++;
        if(j < q.L.size()) ret.ans = min(ret.ans, q.L[j].second - p.R[i].second + 1);
    }
    ret.L = p.L, ret.R = q.R;
    for(ll i = 0; i < q.L.size(); i++){
        if((ret.L.back().first | q.L[i].first) > ret.L.back().first){
            ret.L.push_back({ret.L.back().first | q.L[i].first, q.L[i].second});
        }
    }
    for(ll i = 0; i < p.R.size(); i++){
        if((ret.R.back().first | p.R[i].first) > ret.R.back().first){
            ret.R.push_back({ret.R.back().first | p.R[i].first, p.R[i].second});
        }
    }
    return ret;
}
Node T[400005];
void init(ll n, ll s, ll e){
    if(s == e){
        T[n] = Node(K == 1 ? 1 : INF, 0, s);
        return;
    }
    ll m = (s + e) / 2;
    init(n * 2, s, m); init(n * 2 + 1, m + 1, e);
    T[n] = f(T[n * 2], T[n * 2 + 1]);
}
void update(ll n, ll s, ll e, ll k, ll v){
    if(s == e){
        T[n] = Node(K == 1 ? 1 : INF, v, s);
        return;
    }
    ll m = (s + e) / 2;
    if(k <= m) update(n * 2, s, m, k, v);
    else update(n * 2 + 1, m + 1, e, k, v);
    T[n] = f(T[n * 2], T[n * 2 + 1]);
}
 
int main(){
    cin.tie(0) -> sync_with_stdio(false);
    
    cin >> N >> K >> Q;
    init(1, 1, N);
    for(ll i = 1; i <= N; i++){
        ll v; cin >> v; v--;
        update(1, 1, N, i, v);
    }
    while(Q--){
        ll op; cin >> op;
        if(op == 1){
            ll k, v; cin >> k >> v; v--;
            update(1, 1, N, k, v);
        } else {
            cout << (T[1].ans > N ? -1 : T[1].ans) << '\n';
        }
    }
}

Compilation message

nekameleoni.cpp: In function 'Node f(Node&, Node&)':
nekameleoni.cpp:15:51: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |     for(ll i = p.R.size() - 1, j = 0; i >= 0 && j < q.L.size(); i--){
      |                                                 ~~^~~~~~~~~~~~
nekameleoni.cpp:16:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |         while(j < q.L.size() && (p.R[i].first | q.L[j].first) != (1LL << K) - 1) j++;
      |               ~~^~~~~~~~~~~~
nekameleoni.cpp:17:14: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |         if(j < q.L.size()) ret.ans = min(ret.ans, q.L[j].second - p.R[i].second + 1);
      |            ~~^~~~~~~~~~~~
nekameleoni.cpp:20:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |     for(ll i = 0; i < q.L.size(); i++){
      |                   ~~^~~~~~~~~~~~
nekameleoni.cpp:25:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   25 |     for(ll i = 0; i < p.R.size(); i++){
      |                   ~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 23252 KB Output is correct
2 Correct 28 ms 22980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 23724 KB Output is correct
2 Correct 44 ms 23608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 24112 KB Output is correct
2 Correct 76 ms 24140 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 451 ms 29640 KB Output is correct
2 Correct 1545 ms 46188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1030 ms 40732 KB Output is correct
2 Correct 1969 ms 54648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1229 ms 36596 KB Output is correct
2 Correct 2075 ms 50368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1591 ms 43520 KB Output is correct
2 Correct 1804 ms 51840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1360 ms 42428 KB Output is correct
2 Correct 1918 ms 53632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1947 ms 56588 KB Output is correct
2 Correct 1979 ms 56396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1926 ms 56572 KB Output is correct
2 Correct 1957 ms 56376 KB Output is correct