题目描述
中国正在以前所未有的力度推进脱贫攻坚,国家计划在2020年使得在现行标准下的贫困人口实现全面脱贫,为此,需要对居民的经济状况进行普查。
给定一个正整数 $n$,表示人口数量。一开始,每个居民拥有的财产记为 $a_1,a_2,⋯,a_n$,财产可能发生两种变化:
-
一种来源于个体,由某个居民的经济活动而产生。在某个时刻,某个居民的财产会直接变成某个数值,可能升高也可能降低。
-
一种来源于政策,在某个时刻,国家会对财产低于某个标准线全部的居民,实施政策支持,使得他们的财产全部正好到达标准线。
给定这些变化的详细参数,请做一次统计,输出每个居民最后拥有的财产数量。
输入描述
第一行:两个正整数$n$和$m$;
第二行:$n$个正整数表示$a1,a2,⋯,an$;
接下来$m$行:每行依次表示一次财产变化:
- 以字母
i
开头的表示一次个体变化,后接两个整数参数$u$和$t$,$u$表示财产发生变化的居民编号,$t$表示财产变化的结果; - 以字母
p
开头的表示一次政策变化,后接一个整数参数$s$,$s$表示政策的标准线。
数据范围
- $1≤s≤100000$;
- $1≤t≤100000$;
- $1≤a_i≤100000$;
- 对于30%的数据,$n≤1000$,$m≤1000$;
- 对于60%的数据,$n≤10000$,$m≤10000$;
- 对于100%的数据,$1≤n≤100000$,$1≤m≤100000$。
输出描述
共 $n$ 行:第 $i$ 行有一个整数,表示 $i$ 号居民最后拥有的财产数量。
输入样例
4 3
10 20 30 40
p 35
i 1 20
p 25
输出样例
25
35
35
40
#include <iostream>
using namespace std;
int i, n, m, maxx = 0, a[100001], u[100001], s[100001], ans[100001];
char tmp;
int main()
{
cin >> n >> m;
for (i = 1; i <= n; ++i)
cin >> a[i];
for (i = 1; i <= m; ++i)
{
cin >> tmp;
if (tmp == 'i')
cin >> s[i] >> u[i];
else
cin >> u[i];
}
for (i = m; i > 0; --i)
/* 找最后一次的个人财产变化 */
if (s[i] == 0)
maxx = max(maxx, u[i]);
else if (ans[s[i]] == 0)
ans[s[i]] = max(maxx, u[i]);
for (i = 1; i <= n; ++i)
if (ans[i] == 0)
ans[i] = max(a[i], maxx);
for (i = 1; i <= n; ++i)
cout << ans[i] << endl;
return 0;
}