Submission #1184649

#TimeUsernameProblemLanguageResultExecution timeMemory
1184649WarinchaiWall (IOI14_wall)C++20
100 / 100
789 ms151624 KiB
#include "wall.h"
#include<bits/stdc++.h>
using namespace std;
int inf=1e6;
struct node{
    int mx,mn,mx2,mn2;
    node(int _mx=-inf,int _mn=inf,int _mx2=-inf,int _mn2=inf){
        mx=_mx,mx2=_mx2,mn=_mx,mn2=_mn2;
    }
    friend node operator+(node a,node b){
        node c;
        if(a.mx>b.mx)c.mx=a.mx,c.mx2=max(a.mx2,b.mx);
        else if(b.mx>a.mx)c.mx=b.mx,c.mx2=max(a.mx,b.mx2);
        else c.mx=a.mx,c.mx2=max(a.mx2,b.mx2);
        if(a.mn<b.mn)c.mn=a.mn,c.mn2=min(a.mn2,b.mn);
        else if(b.mn<a.mn)c.mn=b.mn,c.mn2=min(a.mn,b.mn2);
        else c.mn=a.mn,c.mn2=min(a.mn2,b.mn2);
        return c;
    }
};
struct segtree_beats{
    node info[8000005];
    void chmx(int st,int en,int i,int val){
        if(val<info[i].mn)return;
        info[i].mn=val;
        if(val>=info[i].mx)info[i].mx=val;
        else if(val>info[i].mx2)info[i].mx2=val;
    }
    void chmn(int st,int en,int i,int val){
        if(val>info[i].mx)return;
        info[i].mx=val;
        if(val<=info[i].mn)info[i].mn=val;
        else if(val<info[i].mn2)info[i].mn2=val;
    }
    void push(int st,int en,int i){
        int m=(st+en)/2;
        chmx(st,m,i*2,info[i].mn);
        chmx(m+1,en,i*2+1,info[i].mn);
        chmn(st,m,i*2,info[i].mx);
        chmn(m+1,en,i*2+1,info[i].mx);
    }
    void chmax(int st,int en,int i,int l,int r,int val){
        if(st>r||en<l||val<=info[i].mn)return;
        //cerr<<st<<" "<<en<<"\n";
        if(st>=l&&en<=r&&val<info[i].mn2){
            chmx(st,en,i,val);
            //cerr<<"change mn into:"<<info[i].mn<<" "<<info[i].mx<<"\n";
            return;
        }
        int m=(st+en)/2;
        push(st,en,i);
        chmax(st,m,i*2,l,r,val);
        chmax(m+1,en,i*2+1,l,r,val);
        info[i]=info[i*2]+info[i*2+1];
        //cerr<<st<<' '<<en<<" turns into "<<info[i].mn<<" "<<info[i].mn2<<" "<<info[i].mx<<" "<<info[i].mx2<<"\n";
    }
    void chmin(int st,int en,int i,int l,int r,int val){
        if(st>r||en<l||val>=info[i].mx)return;
        if(st>=l&&en<=r&&val>info[i].mx2)return chmn(st,en,i,val);
        int m=(st+en)/2;
        push(st,en,i);
        chmin(st,m,i*2,l,r,val);
        chmin(m+1,en,i*2+1,l,r,val);
        info[i]=info[i*2]+info[i*2+1];
    }
    int fans(int st,int en,int i,int pos){
        if(st==en)return info[i].mx;
        push(st,en,i);
        int m=(st+en)/2;
        if(pos<=m)return fans(st,m,i*2,pos);
        else return fans(m+1,en,i*2+1,pos);
    }
    void build(int st,int en,int i){
        info[i]=node(0,0);
        if(st==en)return;
        int m=(st+en)/2;
        build(st,m,i*2);
        build(m+1,en,i*2+1);
    }
}tr;
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    tr.build(1,n,1);
    //cerr<<"work\n";
    for(int i=0;i<k;i++){
        if(op[i]==1){
            //cerr<<"chmax\n";
            tr.chmax(1,n,1,left[i]+1,right[i]+1,height[i]);
        }else{
            //cerr<<"chmin\n";
            tr.chmin(1,n,1,left[i]+1,right[i]+1,height[i]);
        }
        //cerr<<"mx:"<<tr.info[1].mx<<"\n";
        //for(int i=1;i<=n;i++)cerr<<tr.fans(1,n,1,i)<<" ";
        //cerr<<"\n";
    }
    //cerr<<"work\n";
    for(int i=1;i<=n;i++){
        finalHeight[i-1]=tr.fans(1,n,1,i);
        //cerr<<finalHeight[i-1]<<" ";
    }
    return;
}

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