你可能是用于存点的数组、标记的数组开小了,因为有区间左右端点两个数据要存,至少应该开到 nnn 的两倍。
int p[maxn + 1], flag[maxn + 1];
改为
int p[maxn * 2 + 1], flag[maxn * 2 + 1];