Submission #1125083

#TimeUsernameProblemLanguageResultExecution timeMemory
1125083KhoaDuyWall (IOI14_wall)C++20
100 / 100
597 ms48904 KiB
#include "wall.h"
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
//#define int long long
struct U{
    int Max=-1e9,Min=1e9;
};
U UU(U &app,U &node){
    U pa;
    pa.Max=node.Max;
    pa.Min=node.Min;
    pa.Max=max(pa.Max,app.Max);
    pa.Min=max(pa.Min,app.Max);
    pa.Min=min(pa.Min,app.Min);
    return pa;
}
U Uid;
struct segtree{
    vector<U> d;
    int n,lg;
    void build(int siz){
        n=1;
        while(n<siz){
            n<<=1;
        }
        d.assign(n<<1,Uid);
        lg=__lg(n);
    }
    void apply(int v,U &f){
        d[v]=UU(f,d[v]);
    }
    void push(int v){
        apply(v<<1,d[v]);
        apply((v<<1)|1,d[v]);
        d[v]=Uid;
    }
    void update(int l,int r,U &f){
        if(l>=r){
            return;
        }
        l+=n,r+=n;
        for(int i=lg;i>=1;i--){
            if((l>>i<<i)!=l){
                push(l>>i);
            }
            if((r>>i<<i)!=r){
                push(r>>i);
            }
        }
        for(;l<r;l>>=1,r>>=1){
            if(l&1){
                apply(l,f);
                l++;
            }
            if(r&1){
                r--;
                apply(r,f);
            }
        }
    }
    int query(int l){
        l+=n;
        for(int i=lg;i>=1;i--){
            push(l>>i);
        }
        return (min(max(0,d[l].Max),d[l].Min));
    }
};
void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]){
    segtree seg;
    seg.build(n);
    for(int i=0;i<k;i++){
        U f;
        if(op[i]==1){
            f.Max=height[i];
        }
        if(op[i]==2){
            f.Min=height[i];
        }
        seg.update(left[i],right[i]+1,f);
    }
    for(int i=0;i<n;i++){
        finalHeight[i]=seg.query(i);
    }
}
/*signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n,k;
    cin >> n >> k;
    int op[k],left[k],right[k],height[k],finalHeight[n];
    for(int i=0;i<k;i++){
        cin >> op[i] >> left[i] >> right[i] >> height[i];
    }
    buildWall(n,k,op,left,right,height,finalHeight);
    for(int i=0;i<n;i++){
        cout << finalHeight[i] << endl;
    }
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...