#include using namespace std; const int N=1e6+5; vector g[N]; int Min[N][20], seq[N]; int pos[N], LG2[N], dep[N], res[N], stk[N], top, indx; void dfs(int x,int fa) { indx++, seq[indx]=dep[x], pos[x]=indx; for(auto to:g[x]) if(to!=fa) { dep[to]=dep[x]+1; dfs(to,x); seq[++indx]=dep[x]; } } struct que1 { int pos,l,r,k,id; }; struct que2 { int L,R,k,id; }; vector vec1[N], p1[N]; vector vec2[N], p2[N]; vector num[N]; int val[N]; inline int query(int l,int r,int k) { int L=l, R=r-k+1, pos=l-1; while(L<=R) { int mid=(L+R)>>1; if(val[mid]<=val[mid+k-1]) pos=mid, L=mid+1; else R=mid-1; } int ans=0; if(pos>=l) ans=max(ans,val[pos]); if(pos+k<=r) ans=max(ans,val[pos+k]); return ans; } inline void calc(int lmin,int lmax,int l,int r,int k,int id,int p1,int p2) { lmin=max(lmin,l); lmax=min(lmax,r-k+1); if(lmin<=lmax) vec1[p1].push_back((que1){p2,lmin,lmax+k-1,k,id}); } int Max[N*4]; void build(int rt,int l,int r) { if(l==r) { Max[rt]=val[l]; return; } int mid=(l+r)>>1; build(rt*2,l,mid); build(rt*2+1,mid+1,r); Max[rt]=max(Max[rt*2],Max[rt*2+1]); } int query(int rt,int l,int r,int ql,int qr) { if(ql<=l && r<=qr) return Max[rt]; int mid=(l+r)>>1, ans=0; if(ql<=mid) ans=max(ans,query(rt*2,l,mid,ql,qr)); if(mid+1<=qr) ans=max(ans,query(rt*2+1,mid+1,r,ql,qr)); return ans; } int main() { freopen("query.in","r",stdin); freopen("query.out","w",stdout); int n; cin >> n; for(int i=1;i> q; for(int i=1;i<=q;i++) { int l,r,k; scanf("%d %d %d",&l,&r,&k); int p=LG2[k], nexl=(l+(1<=L;k--) val[k]=min(val[k],val[k+1]); for(int k=mid+1;k<=R;k++) val[k]=min(val[k],val[k-1]); for(auto x:p1[j]) res[x.id]=max(res[x.id],query(x.l,x.r,x.k)); for(int i=l;i<=r;i++) if(mid+i-1<=n) num[i].push_back(query(L,mid+i-1,i)); } for(int i=l;i<=r;i++) { for(int j=0;j