# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1243344 | kla3000 | Wall (IOI14_wall) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> st; vector<int> a; int INF=1000000000;
void build(int ni, int l, int r)
{
st[ni].first=0; st[ni].second=INF;
if(l==r){return;}
int nin=ni *2, m=(l+r)/2;
build(nin, l, m); build(nin+1, m+1, r);
}
void query(int ni, int l, int r)
{
if(l==r){a[l]=st[ni].first; return;}
int nin=ni *2, m=(l+r)/2;
st[nin].first=max(st[nin].first, st[ni].first);
st[nin].second=max(st[nin].second, st[ni].first);
if(st[nin].first>st[nin].second){st[nin] = {st[ni].first, st[ni].first};}
st[nin].second=min(st[nin].second, st[ni].second);
st[nin].first=min(st[nin].first, st[ni].second);
if(st[nin].first>st[nin].second){st[nin] = {st[ni].second, st[ni].second};}
st[nin+1].first=max(st[nin+1].first, st[ni].first);
st[nin+1].second=max(st[nin+1].second, st[ni].first);
if(st[nin+1].first>st[nin+1].second){st[nin+1] = {st[ni].first, st[ni].first};}
st[nin+1].second=min(st[nin+1].second, st[ni].second);
st[nin+1].first=min(st[nin+1].first, st[ni].second);
if(st[nin+1].first>st[nin+1].second){st[nin+1] = {st[ni].second, st[ni].second};}
query(nin, l, m); query(nin+1, m+1, r);
}
void update(int ni, int l, int r, int x, int y, int u)
{
int nin=ni*2;
if(y<l||r<x) return;
if(x<=l&&r<=y)
{
st[ni].first=max(st[ni].first, u); st[ni].second=max(st[ni].second, u);
if(st[ni].first>st[ni].second){st[ni].first=u; st[ni].second=u;}
return;
}
if(l==r) return;
st[nin].first=max(st[nin].first, st[ni].first);
st[nin].second=max(st[nin].second, st[ni].first);
if(st[nin].first>st[nin].second){st[nin] = {st[ni].first, st[ni].first};}
st[nin].second=min(st[nin].second, st[ni].second);
st[nin].first=min(st[nin].first, st[ni].second);
if(st[nin].first>st[nin].second){st[nin] = {st[ni].second, st[ni].second};}
st[nin+1].first=max(st[nin+1].first, st[ni].first);
st[nin+1].second=max(st[nin+1].second, st[ni].first);
if(st[nin+1].first>st[nin+1].second){st[nin+1] = {st[ni].first, st[ni].first};}
st[nin+1].second=min(st[nin+1].second, st[ni].second);
st[nin+1].first=min(st[nin+1].first, st[ni].second);
if(st[nin+1].first>st[nin+1].second){st[nin+1] = {st[ni].second, st[ni].second};}
int m=(l+r)/2;
update(nin, l, m, x, y, u); update(nin+1, m+1, r, x, y, u);
}
void updatep(int ni, int l, int r, int x, int y, int u)
{
int nin=ni*2;
if(y<l||r<x) return;
if(x<=l&&r<=y)
{
st[ni].first=min(st[ni].first, u); st[ni].second=min(st[ni].second, u);
if(st[ni].first>st[ni].second){st[ni].first=u; st[ni].second=u;}
return;
}
st[nin].first=max(st[nin].first, st[ni].first);
st[nin].second=max(st[nin].second, st[ni].first);
if(st[nin].first>st[nin].second){st[nin] = {st[ni].first, st[ni].first};}
st[nin].second=min(st[nin].second, st[ni].second);
st[nin].first=min(st[nin].first, st[ni].second);
if(st[nin].first>st[nin].second){st[nin] = {st[ni].second, st[ni].second};}
st[nin+1].first=max(st[nin+1].first, st[ni].first);
st[nin+1].second=max(st[nin+1].second, st[ni].first);
if(st[nin+1].first>st[nin+1].second){st[nin+1] = {st[ni].first, st[ni].first};}
st[nin+1].second=min(st[nin+1].second, st[ni].second);
st[nin+1].first=min(st[nin+1].first, st[ni].second);
if(st[nin+1].first>st[nin+1].second){st[nin+1] = {st[ni].second, st[ni].second};}
int m=(l+r)/2;
updatep(nin, l, m, x, y, u); updatep(nin+1, m+1, r, x, y, u);
}
int main() {
int n, k; cin>>n>>k; st.assign(4*n+10, {0, 0}); a.assign(n+10, 0);
build(1, 1, n);
while(k--)
{
int c, x, y, h; cin>>c>>x>>y>>h; if(c==2) updatep(1, 1, n, x, y, h);
else update(1, 1, n, x, y, h);
}
query(1, 1, n);
for(int i=1; i<=n; i++)cout<<a[i]<<endl;
}