Submission #1268297

#TimeUsernameProblemLanguageResultExecution timeMemory
1268297dex111222333444555Nautilus (BOI19_nautilus)C++20
0 / 100
112 ms141120 KiB
#include <bits/stdc++.h>
#define dbg(x) "[" << #x << " = " << x << "]"
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define ii pair<int, int>
#define fi first
#define se second
using namespace std;
const int MAXN = 1e5 + 5, MAXV = 1e6 + 6, MOD = 1e9 + 7;
int numVal, val[MAXN], len, numQuery;

struct segmentTree{
    int n;
    vector<int> mx, lazy;
    segmentTree(int _n = 0): n(_n){
        mx.assign(n << 2 | 1, 0);
        lazy.assign(n << 2 | 1, 0);
    }
    void push(int id, int l, int r){
        if (!lazy[id]) return;
        mx[id] += lazy[id];
        if (l != r){
            lazy[id << 1] += lazy[id];
            lazy[id << 1 | 1] += lazy[id];
        }
        lazy[id] = 0;
    }
    void update(int id, int l, int r, int u, int v, int val){
        push(id, l, r);
        if (l > r || l > v || r < u || u > v) return;
        if (l >= u && r <= v){
            lazy[id] += val;
            push(id, l, r);
            return;
        }
        int m = (l + r) >> 1;
        update(id << 1, l, m, u, v, val);
        update(id << 1 | 1, m + 1, r, u, v, val);
        mx[id] = max(mx[id << 1], mx[id << 1 | 1]);
    }
    void update(int u, int v, int val){
        update(1, 1, n, u, v, val);
    }
    int get(int id, int l, int r, int u, int v){
        push(id, l, r);
        if (l > r || l > v || r < u || u > v) return 0;
        if (l >= u && r <= v) return mx[id];
        int m = (l + r) >> 1;
        return max(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v));
    }
    int get(int u, int v){
        return get(1, 1, n, u, v);
    }
};

set<int> st[MAXV];

void input(){
    cin >> numVal >> numQuery >> len;
    for(int i = 1; i <= numVal; i++) cin >> val[i];
}

void solve(){
    map<int, int> mark;
    for(int i = 1; i <= len; i++) mark[val[i]]++;

    segmentTree myIt(numVal - len + 1);
    myIt.update(1, 1, (int)mark.size());
    for(int i = 2; i <= numVal - len + 1; i++){
        mark[val[i - 1]]--;
        if (mark[val[i - 1]] == 0) mark.erase(val[i - 1]);
        mark[val[i + len - 1]]++;
        myIt.update(i, i, (int)mark.size());
    }

    for(int i = 1; i < MAXV; i++) st[i].insert(0), st[i].insert(numVal + 1);
    for(int i = 1; i <= numVal; i++) st[val[i]].insert(i);

    while(numQuery--){
        int type, l, r, pos, x;
        cin >> type;
        if (type == 2){
            cin >> l >> r;
            cout << myIt.get(l, r - len + 1) << '\n';
        }else{
            cin >> pos >> x;
            if (val[pos] == x) continue;

            set<int>::iterator it = st[val[pos]].upper_bound(pos);
            set<int>::iterator it2 = it; it2--; it2--;
            int L = max(max(1, pos - len + 1), (*it2) + 1), R = min(min(numVal, pos), (*it) - len);
            myIt.update(L, R, -1);
            st[val[pos]].erase(pos);

            it = st[x].upper_bound(pos);
            it2 = it; it2--;
            L = max(max(1, pos - len + 1), (*it2) + 1), R = min(min(numVal, pos), (*it) - len);
            myIt.update(L, R, 1);
            st[x].insert(pos); val[pos] = x;
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if (fopen("OBSERVE.inp", "r")){
        freopen("OBSERVE.inp", "r", stdin);
        freopen("OBSERVE.out", "w", stdout);
    }
    int t = 1;
    //cin >> t;
    while(t--){
        input();
        solve();
    }
    cerr << TIME << ".s\n";
}

Compilation message (stderr)

nautilus.cpp: In function 'int main()':
nautilus.cpp:106:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |         freopen("OBSERVE.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
nautilus.cpp:107:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         freopen("OBSERVE.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...