Submission #1087427

#TimeUsernameProblemLanguageResultExecution timeMemory
1087427dwuy벽 (IOI14_wall)C++14
100 / 100
733 ms89284 KiB
/**         - dwuy -

      />    フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ

**/
#include <bits/stdc++.h>

#define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL)
#define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout)
#define fi first
#define se second
#define endl "\n"
#define len(s) (int)((s).size())
#define MASK(k)(1LL<<(k))
#define TASK "test"

using namespace std;

typedef tuple<int, int, int> tpiii;
typedef pair<double, double> pdd;
typedef pair<int, int> pii;
typedef long long ll;

const long long OO = 2e18;
const int MOD = 1e9 + 7;
const int INF = 1e9;

struct SMT{
    int n;
    vector<pii> tree;

    SMT(int n = 0) : n(n), tree(n<<2|3, {0, OO}) {}

    pii combine(pii a, pii b){ /// a -> b;
        a.fi = max(a.fi, b.fi);
        a.se = max(a.se, a.fi);
        a.se = min(a.se, b.se);
        a.fi = min(a.fi, a.se);
        return a;
    }

    void down(int id){
        int ID = id<<1;
        tree[ID] = combine(tree[ID], tree[id]);
        tree[ID|1] = combine(tree[ID|1], tree[id]);
        tree[id] = {0, OO};
    }

    void update(int l, int r, int id, const int &u, const int v, const pii &rv){
        if(l > v || r < u) return;
        if(l >= u && r <= v){
            tree[id] = combine(tree[id], rv);
            return;
        }
        down(id);
        int mid = (l + r)>>1;
        update(l, mid, id<<1, u, v, rv);
        update(mid + 1, r, id<<1|1, u, v, rv);
    }

    void update(int u, int v, pii rv){
        update(1, n, 1, u, v, rv);
    }

    int get(int pos){
        int id = 1;
        for(int lo=1, hi=n; lo<hi;){
            int mid = (lo + hi)>>1;
            down(id);
            if(pos <= mid) hi = mid, id = id<<1;
            else lo = mid + 1, id = id<<1|1;
        }
        return tree[id].fi;
    }
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int res[]){
    SMT smt(n);
    for(int i=0; i<k; i++){
        if(op[i] == 1) smt.update(left[i] + 1, right[i] + 1, {height[i], INF});
        else smt.update(left[i] + 1, right[i] + 1, {-INF, height[i]});
    }
    for(int i=1; i<=n; i++) res[i-1] = smt.get(i);
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...