#include "bits/stdc++.h" using namespace std; typedef long long ll; typedef pair P; const int INF = (1<<30); const ll INFLL = (1ll<<60); const ll MOD = (ll)(1e9+7); #define l_ength size void mul_mod(ll& a, ll b){ a *= b; a %= MOD; } void add_mod(ll& a, ll b){ a = (a v[100100]; void eval(int l, int r, int i){ if(delayed[i]){ segtree[i][0] = 0; if(r-l>1){ delayed[i*2+1] = true; delayed[i*2+2] = true; } delayed[i] = false; } } void init(int l=0, int r=n, int i=0){ segtree[i][0] = r-l; segtree[i][1] = n; if(r-l>1){ init(l,(l+r)>>1,i*2+1); init((l+r)>>1,r,i*2+2); } } void update(int p, int q, int l=0, int r=n, int i=0){ int vl,vr; eval(l,r,i); if(q<=l || r<=p){ return; }else if(p<=l && r<=q){ delayed[i] = true; eval(l,r,i); }else if(r-l>1){ update(p,q,l,(l+r)>>1,i*2+1); update(p,q,(l+r)>>1,r,i*2+2); segtree[i][0] = segtree[i*2+1][0]+segtree[i*2+2][0]; } } int query(int p, int q, int l=0, int r=n, int i=0){ int vl,vr; eval(l,r,i); if(q<=l || r<=p){ return 0; }else if(p<=l && r<=q){ return segtree[i][0]; }else{ vl = query(p,q,l,(l+r)>>1,i*2+1); vr = query(p,q,(l+r)>>1,r,i*2+2); return (vl+vr); } } void update2(int p, int v, int l=0, int r=n, int i=0){ if(!(l<=p && p1){ update2(p,v,l,(l+r)>>1,i*2+1); update2(p,v,(l+r)>>1,r,i*2+2); segtree[i][1] = min(segtree[i*2+1][1],segtree[i*2+2][1]); }else{ segtree[i][1] = v; } } int query2(int p, int q=n, int l=0, int r=n, int i=0){ int vl,vr; if(q<=l || r<=p){ return n; }else if(p<=l && r<=q){ return segtree[i][1]; }else{ vl = query2(p,q,l,(l+r)>>1,i*2+1); vr = query2(p,q,(l+r)>>1,r,i*2+2); return min(vl,vr); } } int main(void){ int q,i,j,t,l,r; cin >> n >> q; init(); for(i=0; i> a[i]; --a[i]; } for(i=0; i> t >> l >> r; --l; v[l].push_back(P(r,i)); } for(i=(n-1); i>=0; --i){ l = i+1; r = query2(a[i]+1); update2(a[i],i); update(l,r); for(j=(v[i].l_ength()-1); j>=0; --j){ ans[v[i][j].second] = query(i,v[i][j].first); } } for(i=0; i