Submission #1032352

#TimeUsernameProblemLanguageResultExecution timeMemory
1032352vjudge1Wall (IOI14_wall)C++17
100 / 100
564 ms138576 KiB
#include "wall.h"

#include<bits/stdc++.h>
using namespace std;

const int lim=2e6+100;

struct{
    struct{
        int rem=0,add=0;
        int last=0;
    }tree[4*lim];
    int ans[lim]{};
    int n;
    void push(int node,int l,int r){
        if(l==r){
            if(tree[node].last){
                ans[l]=max(ans[l],tree[node].add);
                ans[l]=min(ans[l],tree[node].rem);
            }else{
                ans[l]=min(ans[l],tree[node].rem);
                ans[l]=max(ans[l],tree[node].add);
            }
        }else{
            int child=node<<1;
            if(tree[node].last){
                tree[child].rem=max(tree[child].rem,tree[node].add);
                tree[child].add=max(tree[child].add,tree[node].add);
                tree[child].rem=min(tree[child].rem,tree[node].rem);
                tree[child].add=min(tree[child].add,tree[node].rem);
            }else{
                tree[child].rem=min(tree[child].rem,tree[node].rem);
                tree[child].add=min(tree[child].add,tree[node].rem);
                tree[child].rem=max(tree[child].rem,tree[node].add);
                tree[child].add=max(tree[child].add,tree[node].add);
            }
            tree[child].last=tree[node].last;
            child++;
            if(tree[node].last){
                tree[child].rem=max(tree[child].rem,tree[node].add);
                tree[child].add=max(tree[child].add,tree[node].add);
                tree[child].rem=min(tree[child].rem,tree[node].rem);
                tree[child].add=min(tree[child].add,tree[node].rem);
            }else{
                tree[child].rem=min(tree[child].rem,tree[node].rem);
                tree[child].add=min(tree[child].add,tree[node].rem);
                tree[child].rem=max(tree[child].rem,tree[node].add);
                tree[child].add=max(tree[child].add,tree[node].add);
            }
            tree[child].last=tree[node].last;
        }
        tree[node].rem=200000;
        tree[node].add=0;
    }
    int L,R;
    int TY,VAL;
    void update(int l,int r,int node){
        if(r<L||R<l)return;
        push(node,l,r);
        if(L<=l&&r<=R){
            if(TY){
                tree[node].add=VAL;
            }else{
                tree[node].rem=VAL;
            }
            tree[node].last=TY;
            return;
        }
        int mid=(l+r)>>1,child=node<<1;
        update(l,mid,child),update(mid+1,r,child|1);
    }
    void update(int l,int r,int val,int ty){
        L=l,R=r,VAL=val,TY=ty;
        update(0,n-1,1);
    }
    void walk(int l,int r,int node){
        push(node,l,r);
        if(l==r)return;
        int mid=(l+r)>>1,child=node<<1;
        walk(l,mid,child),walk(mid+1,r,child|1);
    }
}st;

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    st.n=n;
    for(int i=0;i<k;i++){
        st.update(left[i],right[i],height[i],op[i]&1);
    }
    st.walk(0,n-1,1);
    for(int i=0;i<n;i++){
        finalHeight[i]=st.ans[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...