答案 620,输出752.代码简单易懂,求调。
#include<bits/stdc++.h>
#define _for(i,x,y) for(int i=x;i<=y;++i)
#define _forp(i,x,y,z) for(int i=x;i<=y;i+=z)
#define _rep(i,x,y) for(int i=x;i<y;++i)
using namespace std;
#define int long long
int n,q;
struct node{
int l,r,x;
}a[25005];
bool cmp(node x,node y){
return x.x>y.x;
}
int f[1000005];
int lowbit(int x){return x&-x;}
int query(int x){
int ans=0;
while(x){
ans=max(ans,f[x]);
x-=lowbit(x);
}
return ans;
}
void change(int pos,int x){
while(pos<=n){
f[pos]=max(f[pos],x);
pos+=lowbit(pos);
}
}
bool check(int pos){
memset(f,-1,sizeof f);
vector<node> v;
_for(i,1,pos){
v.push_back(a[i]);
}
sort(v.begin(),v.end(),cmp);
int r=0;
// cout<<pos<<':'<<'\n';
for(int i=0;i<v.size();i=r+1){
int mnl=0x3f3f3f3f3f3f3f3f,mnr=0x3f3f3f3f3f3f3f3f,mxl=0,mxr=0;
r=i;
while(r<v.size()&&v[r].x==v[i].x){
mnl=min(mnl,v[r].l);
mxl=max(mxl,v[r].l);
mnr=min(mnr,v[r].r);
mxr=max(mxr,v[r].r);
if(r==v.size()-1||v[r+1].x!=v[i].x) break;
else r++;
}
if(mxl>mnr){
return 0;
}
if(query(mxl)>=mnr) return 0;
change(mnl,mxr);
}
return 1;
}
signed main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
//ios::sync_with_stdio(false);
//cin.tie(0);
cin>>n>>q;
_for(i,1,q){
cin>>a[i].l>>a[i].r>>a[i].x;
}
int l=1,r=q,res=0;
while(l<=r){
int mid=l+r>>1;
// cout<<mid<<'\n';
if(check(mid)) res=mid,l=mid+1;
else r=mid-1;
}
cout<<(res==q?0:res+1);
return 0;
}