终于自己能找出线段树的错误了。 #include<cstdio> #include<iostream> using namespace std; const int inf=1<<30; struct seg_tree { int left; int right; int _max; int _min; int cha; int calmid() { return (left+right)>>1; } }; seg_tree tt[100005*3]; void build(int idx,int left,int right) { tt[idx].left=left; tt[idx].right=right; tt[idx]._max=0; tt[idx]._min = 0; tt[idx].cha = inf; if(left == right) return; int mid = tt[idx].calmid(); build(idx<<1,left,mid); build(idx<<1|1,mid+1,right); } void update(int idx,int id,int index) { if(id == tt[idx].left && id == tt[idx].right) { if(index==-1 && tt[idx]._max!=0) { tt[idx]._max=tt[idx]._min=0; tt[idx].cha = inf; } else if(index == 1 && tt[idx]._max ==0) { tt[idx]._max = id; tt[idx]._min = id; tt[idx].cha = inf; } return; } int mid = tt[idx].calmid(); int a=0; int b=0; if(id<=mid) update(idx<<1,id,index); else if(id>mid) update(idx<<1|1,id,index); if(tt[idx<<1|1]._max>0) tt[idx]._max=tt[idx<<1|1]._max; else tt[idx]._max = tt[idx<<1]._max; if(tt[idx<<1]._min>0) tt[idx]._min = tt[idx<<1]._min; else tt[idx]._min = tt[idx<<1|1]._min; //if(tt[idx<<1].cha !=inf || tt[idx].cha!=inf) tt[idx].cha = min(tt[idx<<1].cha,tt[idx<<1|1].cha); if(tt[idx<<1]._max>0) a = tt[idx<<1]._max; if(tt[idx<<1|1]._min>0) b = tt[idx<<1|1]._min; if(a>0 && b>0) tt[idx].cha = min(tt[idx].cha,b-a); } int main() { freopen("in.txt","r",stdin); int test; cin>>test; while(test--) { int n; cin>>n; build(1,1,100005); while(n--) { char ch[100]; scanf("%s",ch); if(ch[0]=='g'){ int x; scanf("%d",&x); update(1,x,1); } else if(ch[0]=='r') { int x; scanf("%d",&x); update(1,x,-1); } else { if(tt[1].cha == inf) printf("-1/n"); else printf("%d/n",tt[1].cha); } } if(test!=0)cout<<endl; } return 0; }