题目翻译(来自luogu)
样例
说明
#include <bits/stdc++.h>
using namespace std;
long long a[300100]; //存储a
bool vis[300100]; //是否被访问
long long sum; //总合
queue<int> Q;
int main()
{
ios::sync_with_stdio(false); //关闭同步流
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q; //输入n,q;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i]; //总合
}
long long kkk = 0; //kkk代表 当前是否执行过2操作。kkk==0 没执行过2操作 kkk>=1执行过2操作。
while (q--)
{
long long x, y, z;
cin >> x >> y;
if (x == 1)
{
cin >> z;
if (kkk == 0) //没执行过2操作 正常的进行算数
{
sum = sum + (z - a[y]);
a[y] = z;
cout << sum << '\n';
}
else //进行过2操作
{
if (vis[y] == 0) //如果进行2操作后,a[y]没被改过,那么把a[y]的值kkk修改成z
{
vis[y] = 1;
Q.push(y); //将y号压入队列Q中
sum = sum + (z - kkk);
a[y] = z;
cout << sum << '\n';
}
else //如果进行2操作后,a[y]被改过 那么把a[y]的值改为z
{
sum = sum + (z - a[y]);
a[y] = z;
cout << sum << '\n';
}
}
}
else
{
//memset(vis)的时间复杂度太高 所以用队列减小时间复杂度
while (!Q.empty())
{
vis[Q.front()] = 0;
Q.pop();
}
sum = y * n;
kkk = y; //将数组中所有的值修改成kkk;
cout << sum << '\n';
}
}
}