#include #define rep(i,x,y) for (int i = (x); i<=(y); i++) #define repe(i,x,y) for (int i = (x); i < (y);i++) #define drep(i,x,y) for (int i = (x); i >= (y); i--) #define mp make_pair #define pb push_back #define MAX(a,b) (((a)>(b))?(a):(b)) #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAXN 60000 #define sf(n) scanf("%Lf",&n) #define prf(n) printf("%Lf",n) #define s(n) scanf("%d",&n) #define sl(n) scanf("%lld",&n) #define pr(n) printf("%d",n) #define prl(n) printf("%lld",n) #define endc printf("\n") #define psp printf(" ") using namespace std; typedef long long ll; typedef long double ld; typedef pair pii; typedef struct report { int many, color; bool all; } report; report newreport(int many,int color,bool all) { report x = *new report(); x.many = many; x.color = color; x.all = all; return x; } int n,m; int lft[8*MAXN]; int ln[8*MAXN]; int rn[8*MAXN]; int rgt[8*MAXN]; int sz[8*MAXN]; bool lazy[8*MAXN]; void dev(int x) { lft[x] = lft[x*2]; ln[x] = ln[x*2]; if (rn[x*2] == ln[x*2] && ln[x*2] == ln[x*2 + 1]) { lft[x] += lft[x*2 + 1]; } rgt[x] = rgt[x*2 + 1]; rn[x] = rn[x*2 + 1]; if (ln[x*2 + 1] == rn[x*2 + 1] && rn[x*2] == rn[x*2 + 1]) { rgt[x] += rgt[x*2]; } } void push(int x,int l,int r) { // means x is monochrome if (!lazy[x]) return; lazy[x*2] = true; lazy[x*2 + 1] = true; lazy[x] = false; int color = ln[x]; int mid = (l+r)/2; ln[x*2] = rn[x*2] = ln[x*2 + 1] = rn[x*2 + 1] = color; lft[x*2] = rgt[x*2] = sz[x*2]; lft[x*2 + 1] = rgt[x*2 + 1] = sz[x*2 + 1]; } void init(int x,int l,int r) { lazy[x] = false; sz[x] = r-l+1; if (l == r) { lft[x] = 1; rgt[x] = 1; ln[x] = 0; rn[x] = 0; return; } int mid = (l+r)/2; init(x*2,l,mid); init(x*2 + 1,mid+1,r); dev(x); } void update(int x,int l,int r,int i,int j,int c) { push(x,l,r); if (j < l || r < i) return; if (i <= l && r <= j) { ln[x] = rn[x] = c; lft[x] = rgt[x] = r-l+1; lazy[x] = true; return; } int mid = (l+r)/2; update(x*2,l,mid,i,j,c); update(x*2 + 1,mid+1,r,i,j,c); dev(x); } report leftquery(int x,int l,int r,int p) { push(x,l,r); if (l == r) { return newreport(1,ln[x],true); } int mid = (l+r)/2; if (p <= mid) { return leftquery(x*2,l,mid,p); } else { report ans = leftquery(x*2 + 1,mid+1,r,p); if (ans.all && rn[x*2] == ans.color) { ans.many += rgt[x*2]; ans.all = false; if (rgt[x*2] == sz[x*2]) ans.all = true; } else { ans.all = false; } return ans; } } report rightquery(int x,int l,int r,int p) { push(x,l,r); if (l == r) { return newreport(1,rn[x],true); } int mid = (l+r)/2; if (p > mid) { return rightquery(x*2 + 1,mid+1,r,p); } else { report ans = rightquery(x*2,l,mid,p); if (ans.all && ln[x*2 + 1] == ans.color) { ans.many += lft[x*2 + 1]; ans.all = false; if (lft[x*2 + 1] == sz[x*2 + 1]) ans.all = true; } else { ans.all = false; } return ans; } } int gv(int x,int l,int r,int p) { push(x,l,r); if (l == r) return ln[x]; int mid = (l+r)/2; if (p <= mid) return gv(x*2,l,mid,p); return gv(x*2 + 1,mid+1,r,p); } int main() { s(n); s(m); init(1,1,n); while (m--) { int type; s(type); if (type == 1) { int a,b,c; s(a); s(b); s(c); update(1,1,n,a,b,c); } else { int p; s(p); int col = gv(1,1,n,p); int lf = p - leftquery(1,1,n,p).many + 1; int rg = p + rightquery(1,1,n,p).many - 1; printf("%d %d %d\n",col,lf,rg); } } return 0; }