题目
写的第一道交互题,编译要加这么一句话(代码在 wall.cpp中):
g++ -o wall grader.cpp wall.cpp
其他的,就是裸的线段树了
#include "wall.h"
const int N=2000002;
#define mid ((l+r)>>1)
int mx[N<<2],mn[N<<2];
void build(int t,int l,int r){
if (l==r) return;
mn[t]=1e9;
build(t<<1,l,mid);
build(t<<1|1,mid+1,r);
}
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
void up(int t,int h,bool f){
mx[t]=(f?min(mx[t],h):max(mx[t],h));
mn[t]=(f?min(mn[t],h):max(mn[t],h));
}
void down(int t){
up(t<<1,mx[t],0),up(t<<1|1,mx[t],0),mx[t]=0;
up(t<<1,mn[t],1),up(t<<1|1,mn[t],1),mn[t]=1e9;
}
void change(int t,int l,int r,int x,int y,int v,bool f){
if (x<=l && r<=y){
up(t,v,f);
return;
}
down(t);
if (x<=mid) change(t<<1,l,mid,x,y,v,f);
if (mid<y) change(t<<1|1,mid+1,r,x,y,v,f);
}
void write(int t,int l,int r,int *ans){
if (l==r){
ans[l-1]=mx[t];
return;
}
down(t);
write(t<<1,l,mid,ans);
write(t<<1|1,mid+1,r,ans);
}
void buildWall(int n,int k,int op[],int l[],int r[],int h[],int ans[]){
build(1,1,n);
for (int i=0;i<k;i++) change(1,1,n,l[i]+1,r[i]+1,h[i],op[i]-1);
write(1,1,n,ans);
}