#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
int N,tiempo=-1e9;
vector<pair<int,int>> segmentres;
vector<pair<int,int>> lazy[2]; // valor,tiempo
void propagate(int node,int l,int r){
if(lazy[0][node].first!=-1 && lazy[1][node].first!=-1 && lazy[0][node].first>lazy[1][node].first){
if(lazy[0][node].second<lazy[1][node].second){
lazy[0][node].first=lazy[1][node].first;
}else{
lazy[1][node].first=lazy[0][node].first;
}
}
if(l==r){
if(lazy[0][node].first!=-1){
segmentres[node].second=lazy[0][node].first;
}
if(lazy[1][node].first!=-1){
segmentres[node].first=lazy[1][node].first;
}
return;
}
int hiji=2*node+1,hijd=2*node+2;
if(lazy[0][node].first!=-1){
segmentres[node].second=lazy[0][node].first;
lazy[0][hiji].first=max(lazy[0][hiji].first,lazy[0][node].first);
lazy[0][hijd].first=max(lazy[0][hijd].first,lazy[0][node].first);
lazy[0][hiji].second=tiempo++;
lazy[0][hijd].second=tiempo++;
}
if(lazy[1][node].first!=-1){
segmentres[node].first=lazy[1][node].first;
lazy[1][hiji].first=min(lazy[1][hiji].first,lazy[1][node].first);
lazy[1][hijd].first=min(lazy[1][hijd].first,lazy[1][node].first);
lazy[1][hiji].second=tiempo++;
lazy[1][hijd].second=tiempo++;
}
lazy[0][node].first=lazy[1][node].first=-1;
}
pair<int,int> query(int node,int l,int r,int i,int j){
propagate(node,l,r);
if(j<l || r<i){
return {-1e9,1e9};
}
if(i<=l && r<=j){
return segmentres[node];
}
int hiji=2*node+1,hijd=2*node+2,mid=(l+r)>>1;
pair<int,int> fir=query(hiji,l,mid,i,j),sec=query(hijd,mid+1,r,i,j);
return {max(fir.first,sec.first),min(fir.second,sec.second)};
}
void update(int node,int l,int r,int i,int j,int val,int tipo){
propagate(node,l,r);
int mid=(l+r)>>1,hiji=2*node+1,hijd=2*node+2;
if(i==l && j==r){
pair<int,int> ans=query(node,l,r,i,j);
if(tipo==1){
if(ans.first<=val){
lazy[0][node].first=val;
lazy[0][node].second=tiempo++;
}
}else{
if(ans.second>=val){
lazy[1][node].first=val;
lazy[1][node].second=tiempo++;
}
}
return;
}
if(i<=mid){
update(hiji,l,mid,i,mid,val,tipo);
}
if(j>mid){
update(hijd,mid+1,r,mid+1,j,val,tipo);
}
segmentres[node].first=max(segmentres[hiji].first,segmentres[hijd].first);
segmentres[node].second=min(segmentres[hiji].second,segmentres[hijd].second);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
for(int i=0;i<n;i++){
finalHeight[i]=0;
}
for(int i=0;i<k;i++){
for(int j=left[i];j<=right[i];j++){
if(op[i]==1){
finalHeight[j]=max(finalHeight[j],height[i]);
}else{
finalHeight[j]=min(finalHeight[j],height[i]);
}
}
}
return;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |