题意:给你一个数组,两个操作,1.把下标为i的数改为x,2.把所有数都改为x,求最后数组的总数
思路:参考了大佬的思路,是创建一个结构数组a用来存放,结构里一个val记录i上次改变的值,ts记录上次被改变的时间点,再用一个结构all来存上次操作2之后的值和时间点,当进行操作1的时候,比较一下a[i]上次被改变的时间点和上次操作2之后的时间点,如果a[i].ts>=all.ts说明了a[i]的改变在操作2之后,那么我们就直接用a[i]里存的值进行运算,sum+=x-a[i].val,如果a[i].ts<all.ts说明a[i]上次改变的时间点是在操作2之前,所以我们用all里的数值,即sum+=x-all.val,最后操作完之后记得更新一下a[i]的val和ts。当进行操作2的时候我们改变一下all的val和ts之后,sum直接等于n*all.val。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
struct name{
int val;
int ts;
};
name a[200005],all;
int n,q;
void sove(){
cin>>n>>q;
ll sum=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
a[i].val =x;
a[i].ts =0;
sum+=1ll*a[i].val ;
}
all.ts =0;
for(int ts=1;ts<=q;ts++){
int t,i,x;
cin>>t;
if(t==1){
cin>>i>>x;
if(a[i].ts >=all.ts ){
sum+=x-a[i].val;
}else{
sum+=x-all.val ;
}
a[i].ts =ts;
a[i].val =x;
printf("%lld\n",sum);
}else{
cin>>x;
all.ts =ts;
all.val =x;
sum=1ll*all.val *n;
printf("%lld\n",sum);
}
}
}
int main(){
int t=1;
//cin>>t;
while(t--){
sove();
}
return 0;
}