新思路,先给佬磕一个

这个思路的核心就是修改当前位的值只需要通过x与当前下标中的值的差来修改sum即可,然后就是如何获取当前下标中的值,起初我也有类似的想法,但是没有这么妙,修改所有数的地方我甚至傻傻的把数组a遍历了一遍一个个修改然后重新求和,直接猛猛超时。这道题只需要获得当前位的数值是多少就好了,对于全部的数修改,并不需要实际修改数组。用pair存储是第几次修改以及修改为的数值是多少,然后在修改单个值的时候,只需要判断是在整体修改之后发生,还是之前发生,如果是之前发生,那么当前值,直接使用pair中存储的数值即可,反之同理。

然后不要忘记更新数组中存储的内容。

#include<bits/stdc++.h>
using namespace std;
int n,q;
typedef long long ll;
const int M=2e5+5;
ll a[M];
pair<ll,ll> p;
int main(){
	cin>>n>>q;
	vector<pair<ll,ll> > ve(n+5);
	ll sum=0;
	p={-1,0};
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum+=a[i];
		ve[i]={0,a[i]};
	}
	for(int i=1;i<=q;i++){
		int t;
		cin>>t;
		ll tmp;
		if(t==1){
			int ind,x; cin>>ind>>x;
			if(p.first>ve[ind].first) tmp=p.second;
			else tmp=ve[ind].second;
			sum+=x; sum-=tmp;
			ve[ind]={i,x};
		}
		else{
			int x; cin>>x;
			p={i,x};
			sum=x*n;
		}
		cout<<sum<<endl;
	}
	return 0;
}