本蒟蒻写了个线段树,结果最后一个输出挂了,有大佬帮调吗?
#include<bits/stdc++.h>
using namespace std;
#define lid (id<<1)
#define rid (id<<1|1)
#define ll long long
#define ull unsigned long long
const int N=2e5+5,mod=1e9+7;
inline void sleep(int p);
inline int read();
inline int read(int mod);
int n,m;
struct sa{
int l,r,mlr,lr;
int lmax,rmax,smax;
int tag;
}tree[N<<1];
void print(int id){
printf("%d:%d~%dlm:%drm:%dsm:%dlz:%d\n",id,tree[id].l,tree[id].r,tree[id].lmax,tree[id].rmax,tree[id].smax,tree[id].tag);
return;
}
void pushup(int id){
tree[id].lmax=tree[lid].lmax,tree[id].rmax=tree[rid].rmax;
if(tree[lid].lmax==tree[lid].lr)tree[id].lmax=tree[lid].lr+tree[rid].lmax;
if(tree[rid].rmax==tree[rid].lr)tree[id].rmax=tree[rid].lr+tree[lid].rmax;
tree[id].smax=max(max(tree[lid].smax,tree[rid].smax),tree[lid].rmax+tree[rid].lmax);
return;
}
void pushdown(int id){
if(tree[id].tag==0||tree[id].lr==1)return ;
if(tree[id].tag==1){//搬空
tree[lid].lmax=tree[lid].rmax=tree[lid].smax=tree[lid].lr;
tree[rid].lmax=tree[rid].rmax=tree[rid].smax=tree[rid].lr;
tree[id].tag=0;
tree[lid].tag=tree[rid].tag=1;
}
else{
tree[lid].lmax=tree[lid].rmax=tree[lid].smax=0;
tree[rid].lmax=tree[rid].rmax=tree[rid].smax=0;
tree[id].tag=0;
tree[lid].tag=tree[rid].tag=2;
}
return;
}
void build(int id,int l,int r){
tree[id].l=l,tree[id].r=r,tree[id].lr=r-l+1,tree[id].mlr=l+r>>1;
if(l==r){
tree[id].lmax=tree[id].rmax=tree[id].smax=1;
return;
}
build(lid,l,tree[id].mlr);
build(rid,tree[id].mlr+1,r);
pushup(id);
return;
}
void update(int id,int l,int r,int op){
pushdown(id);
if(tree[id].l>r||tree[id].r<l)return;
if(tree[id].l>=l&&tree[id].r<=r){
tree[id].lmax=tree[id].rmax=tree[id].smax=tree[id].lr*(op-1);
tree[id].tag=op;
return;
}
if(l<=tree[id].mlr)update(lid,l,r,op);
if(tree[id].mlr+1<=r)update(rid,l,r,op);
pushup(id);
return;
}
int query(int id,int len){
pushdown(id);
if(tree[id].l==tree[id].r)return tree[id].l;
if(tree[lid].smax>=len)return query(lid,len);
if(tree[lid].rmax+tree[rid].lmax)return tree[id].mlr-tree[lid].rmax+1;
return query(rid,len);
}
int main(){
n=read(),m=read();
build(1,1,n);
while(m--){
int op;
op=read();
if(op==1){
int len=read();
if(tree[1].smax<len)printf("0\n");
else {
int l=query(1,len);
update(1,l,l+len-1,1);
printf("%d\n",l);
}
}
else{
int l=read(),r=read();r=l+r-1;
update(1,l,r,2);
}
}
return 0;
}
inline void sleep(int p){for(int i=1;i<=100000*p;i++)int x;return;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline int read(int p){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();x=x%p;}return x*f;}