Submission #763520

#TimeUsernameProblemLanguageResultExecution timeMemory
763520Ahmed57Wall (IOI14_wall)C++17
100 / 100
598 ms103900 KiB
#include <bits/stdc++.h>

using namespace std;
int seg[6000001];
void build(int p,int l,int r){
    if(l==r){
        seg[p] = 0;
        return ;
    }
    int md = (l+r)/2;
    build(p*2,l,md);build(p*2+1,md+1,r);
}
int li[6000001],ri[6000001];
void prop(int p,int l,int r){
    if(li[p]==-1)return ;
    //cout<<l<<" "<<r<<" "<<li[p]<<" "<<ri[p]<<endl;
    if(l==r){
        if(seg[p]<li[p]){
            seg[p] = li[p];
        }if(seg[p]>ri[p]){
            seg[p] = ri[p];
        }
    }
    if(l!=r){
        if(li[p*2]==-1){
            li[p*2] = li[p];
            ri[p*2] = ri[p];
        }else{
            if(ri[p*2]<li[p]){
                li[p*2] = li[p];
                ri[p*2] = li[p];
            }else if(ri[p]<li[p*2]){
                li[p*2] = ri[p];
                ri[p*2] = ri[p];
            }else{
                li[p*2] = max(li[p*2],li[p]);
                ri[p*2] = min(ri[p*2],ri[p]);
            }
        }
        if(li[p*2+1]==-1){
            li[p*2+1] = li[p];
            ri[p*2+1] = ri[p];
        }else{
            if(ri[p*2+1]<li[p]){
                li[p*2+1] = li[p];
                ri[p*2+1] = li[p];
            }else if(ri[p]<li[p*2+1]){
                li[p*2+1] = ri[p];
                ri[p*2+1] = ri[p];
            }else{
                li[p*2+1] = max(li[p*2+1],li[p]);
                ri[p*2+1] = min(ri[p*2+1],ri[p]);
            }
        }
    }
    li[p] = -1 , ri[p] = -1;
}
void update(int p,int l,int r,int lq,int rq,int ll,int rr){
    prop(p,l,r);
    if(l>=lq&&r<=rq){
        li[p]=ll;
        ri[p]=rr;
        prop(p,l,r);
        return ;
    }
    if(l>rq||r<lq)return ;
    int md = (l+r)/2;
    update(p*2,l,md,lq,rq,ll,rr);
    update(p*2+1,md+1,r,lq,rq,ll,rr);
}
vector<int> ans;
void dfs(int p,int l,int r){
    prop(p,l,r);
    if(l==r){
        ans.push_back(seg[p]);
        return ;
    }
    int md = (l+r)/2;
    dfs(p*2,l,md);
    dfs(p*2+1,md+1,r);
}
void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]){
    memset(li,-1,sizeof li);
    memset(ri,-1,sizeof ri);
    build(1,1,n);
    for(int i = 0;i<k;i++){
        if(op[i]==1){
            update(1,1,n,left[i]+1,right[i]+1,height[i],1e9);
        }else{
            update(1,1,n,left[i]+1,right[i]+1,0,height[i]);
        }
        ans.clear();
    }
    dfs(1,1,n);
    for(int i = 0;i<n;i++){
        finalHeight[i] = ans[i];
    }
}
/*
int main(){
    int op[] = {1,2,2,1,1,2};
    int height[] = {4,1,5,3,5,0};
    int left[] = {1,4,3,0,2,6};
    int right[] = {8,9,6,5,2,7};
    buildWall(10,6,op,left,right,height);
    return 0;
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...