C. Report

时间:2023-06-20 11:19:32

题意:给出n个无序的数以及m个操作,每个操作由两个数组成,第一个数是操作的方式,第二个数 i 是操作的范围,若第一个数是1,则给 1-i 个数按升序排序,若第二个数是2,则给 1-i 个数按降序排列。输出所有操作完成后的序列。

C. Report

C. Report

C. Report

int n, m;
arr a, ans;
int top = ;
int tot = ;
struct node
{
int r, tp, id;
} p[N], q[N];
bool cmp(node a, node b)
{
if (a.r == b.r)
return a.id > b.id;
return a.r > b.r;
} int main()
{
// file("test");
sdf(n), sdf(m);
For(i, , n) sdf(a[i]);
For(i, , m)
{
int x, y;
sdf(x), sdf(y);
p[i] = (node){y, x, i};
}
sort(p + , p + + m, cmp);
int st = ;
For(i, , m)
{
if (p[i].id < st)
continue;
st = p[i].id;
if (i >= && p[i].tp == q[tot].tp)
continue;
q[++tot] = p[i];
if (p[i].id == m)
break;
}
top = n+;
FFor(i, n, q[].r + )
ans[--top] = a[i];
sort(a + , a + + q[].r);
int L = , R = q[].r; For(i, , tot)
{
int dt = q[i].r - q[i + ].r;
if (q[i].tp == )
{
FFor(j, R, R-dt+)
ans[--top] = a[j];
R -= dt;
}
else
{
For(j, L, L + dt - )
ans[--top] = a[j];
L += dt;
}
}
For(i,,n)
printf("%d ", ans[i]); return ;
}