可能题解不是非常的正确与清晰……
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=500010;
int ans[N];
int main(){
int n,x;
scanf("%d%d",&n,&x); // 输入
bool success=true; // 判断是否能飞到终点
int up=0,down=0,last=0; // 记录飞行的上限值、下限值和上一个障碍的横坐标。
for(int i=1;i<=n&&success;i++){ // 循环
int x,a,b;
scanf("%d%d%d",&x,&a,&b); // 输入障碍信息
++a,--b; // 由于不能擦边,所以要将可通过范围缩小1
up+=x-last; // 更新上限值
down-=x-last; // 更新下限值
/*
由于奇偶性必须相同,所以需要判断奇偶性来更加缩小可通过范围。
*/
if((up&1)!=(b&1)) --b;
if((down&1)!=(a&1)) ++a;
up=min(up,b); // 更新上限值
down=max(down,a); // 更新下限值
if(up<down){ // 如果范围重叠或变形
success=false; // 表示不可通过
break; // 退出
}
ans[i]=(x+down)/2; // 存入答案
last=x; // 更新横坐标
}
if(!success) // 如果不能通过
puts("Stupid bird!"); // 输出
else{ // 如果可以通过
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]); // 输出答案
printf("%d\n",ans[n]); // 输出答案
}
return 0;
}