我也不知道怎么回事,直接 T 成勾了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int n,k,a[2000001];
inline int R() {
int x = 0; char c = getchar(); while (!isdigit(c)) c = getchar();
while (isdigit(c)) x = x * 10 + c - '0', c = getchar(); return x;
}
struct Tree { int maxn,minn,maxtag,mintag; }t[8000001];
void build(int x,int l,int r) {
t[x]={0,0,(int)1e9,0};
if (l==r) return;
build(x<<1,l,(l+r>>1)),build(x<<1|1,(l+r>>1)+1,r);
}
void pushdown(int x) {
if (t[x].mintag) {
t[x<<1].minn=max(t[x<<1].minn,t[x].mintag),t[x<<1].mintag=max(t[x<<1].mintag,t[x].mintag);
t[x<<1].maxn=max(t[x<<1].maxn,t[x].mintag),t[x<<1].maxtag=max(t[x<<1].maxtag,t[x].mintag);
t[x<<1|1].minn=max(t[x<<1|1].minn,t[x].mintag),t[x<<1|1].mintag=max(t[x<<1|1].mintag,t[x].mintag);
t[x<<1|1].maxn=max(t[x<<1|1].maxn,t[x].mintag),t[x<<1|1].maxtag=max(t[x<<1|1].maxtag,t[x].mintag);
t[x].mintag=0;
}
if (t[x].maxtag!=1e9) {
t[x<<1].minn=min(t[x<<1].minn,t[x].maxtag),t[x<<1].mintag=min(t[x<<1].mintag,t[x].maxtag);
t[x<<1].maxn=min(t[x<<1].maxn,t[x].maxtag),t[x<<1].maxtag=min(t[x<<1].maxtag,t[x].maxtag);
t[x<<1|1].minn=min(t[x<<1|1].minn,t[x].maxtag),t[x<<1|1].mintag=min(t[x<<1|1].mintag,t[x].maxtag);
t[x<<1|1].maxn=min(t[x<<1|1].maxn,t[x].maxtag),t[x<<1|1].maxtag=min(t[x<<1|1].maxtag,t[x].maxtag);
t[x].maxtag=1e9;
}
}
void updmin(int x,int l,int r,int L,int R,int k) {
if (l==r) {
t[x].minn=max(t[x].minn,k),t[x].mintag=max(t[x].mintag,k);
t[x].maxn=max(t[x].maxn,k),t[x].maxtag=max(t[x].maxtag,k);
return;
}
int mid=(l+r>>1); pushdown(x);
if (L<=mid) updmin(x<<1,l,mid,L,R,k);
if (R>mid) updmin(x<<1|1,mid+1,r,L,R,k);
t[x].minn=min(t[x<<1].minn,t[x<<1|1].minn);
t[x].maxn=max(t[x<<1].maxn,t[x<<1|1].maxn);
}
void updmax(int x,int l,int r,int L,int R,int k) {
if (l==r) {
t[x].maxn=min(t[x].maxn,k),t[x].maxtag=min(t[x].maxtag,k);
t[x].minn=min(t[x].minn,k),t[x].mintag=min(t[x].mintag,k);
return;
}
int mid=(l+r>>1); pushdown(x);
if (L<=mid) updmax(x<<1,l,mid,L,R,k);
if (R>mid) updmax(x<<1|1,mid+1,r,L,R,k);
t[x].minn=min(t[x<<1].minn,t[x<<1|1].minn);
t[x].maxn=max(t[x<<1].maxn,t[x<<1|1].maxn);
}
int ask(int x,int l,int r,int k) {
if (l==r) return t[x].maxn;
int mid=(l+r>>1); pushdown(x);
if (k<=mid) return ask(x<<1,l,mid,k);
else return ask(x<<1|1,mid+1,r,k);
}
int main() {
n=R(),k=R();
build(1,1,n);
for (int i=1,t,l,r,h;i<=k;i++) {
t=R(),l=R()+1,r=R()+1,h=R();
if (t==1) updmin(1,1,n,l,r,h);
else updmax(1,1,n,l,r,h);
}
for (int i=1;i<=n;i++) printf("%d\n",ask(1,1,n,i));
return 0;
}