#include <iostream>
#include <cstdio>
using namespace std;
const int N = 10010;
//p[i]表示排序后i位置的数在原数组p[i]位置
//np[i]表示原数组i位置的数在排序后的数组np[i]
int a[N], p[N], np[N];
int n, q;
//向前调整
void forward(int k)
{
for(int i = k; i > 1 && a[i] <= a[i - 1]; i --)
{
//如果相等,需要判断原来位置的前后关系,从而保证插入排序的稳定性,即原来在前的还是在前
if(a[i] == a[i - 1] && p[i] > p[i - 1]) continue;
swap(a[i], a[i - 1]);
np[p[i]] = i - 1;
np[p[i - 1]] = i;
swap(p[i], p[i - 1]);
}
}
//向后调整
void backward(int k)
{
for(int i = k; i < n && a[i] >= a[i + 1]; i ++)
{
//如果相等,需要判断原来位置的前后关系,从而保证插入排序的稳定性,即原来在后面的还是在后面
if(a[i] == a[i + 1] && p[i] < p[i + 1]) continue;
swap(a[i], a[i + 1]);
np[p[i]] = i + 1;
np[p[i + 1]] = i;
swap(p[i], p[i + 1]);
}
}
int main()
{
freopen("sort.in", "r", stdin);
freopen("sort.out", "w", stdout);
cin >> n >> q;
for(int i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
np[i] = p[i] = i;
}
//插入排序
for(int i = 2; i <= n; i ++) forward(i);
while(q --)
{
int op, x, v;
scanf("%d%d", &op, &x);
if(op == 1)
{
scanf("%d", &v);
int k = np[x];
a[k] = v;
//更新后,向前或向后进行调整
forward(k);
backward(k);
}
else printf("%d\n", np[x]);
}
}
CSP-J 2021测试源文件
需积分: 0 52 浏览量
2023-10-17
15:29:31
上传
评论
收藏 1.85MB ZIP 举报
少儿编程乔老师
- 粉丝: 1w+
- 资源: 5
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈