C++——单双数增加

单双数增加

Description

给定一个长度为 n n n的数列,有 q q q次操作,问每次执行完操作后数列的总和。
共有两种操作:
0   x \texttt{0\space x} 0 x,给所有偶数加上 x x x
1   x \texttt{1\space x} 1 x,给所有奇数加上 x x x

Format

Input

第一行包含两个整数 n n n q q q ——数组 a a a的长度和查询的数量。
第二行正好包含 n n n的整数: a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an——数组 a a a的元素。
下面的 q q q行包含两个整数 t y p e j type_j typej x j x_j xj ( 0 ≤ t y p e j ≤ 1 , 1 ≤ x j ≤ 1 0 4 ) (0 \leq type_j \leq 1, 1 \leq x_j \leq 10^4) (0typej1,1xj104)的查询。

Output

打印 q q q行:处理查询后数组 a a a的元素之和。

Samples

输入数据 1

6 7
1 3 2 4 10 48
1 6
0 5
0 4
0 5
1 3
0 12
0 1

输出数据 1

80
100
100
100
118
190
196

输入数据 2

6 7
1000000000 1000000000 1000000000 11 15 17
0 17
1 10000
1 51
0 92
0 53
1 16
0 1

输出数据 2

3000000094
3000060094
3000060400
3000060952
3000061270
3000061366
3000061366

Constraints

对于 50 % 50\% 50%的数据, 1 ≤ n , q , a i ≤ 1 0 2 1\leq n,q,a_i \leq 10^2 1n,q,ai102
对于 100 % 100\% 100%的数据, 1 ≤ n , q ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 9 1\leq n,q \leq 10^5,1\leq a_i \leq 10^9 1n,q105,1ai109

Note

第一个测试用例,数组的变化如下:

1, 3, 2, 4, 10, 48
7, 9, 2, 4, 10, 48
7, 9, 7, 9, 15, 53
7, 9, 7, 9, 15, 53
10, 12, 10, 12, 18, 56
22, 24, 22, 24, 30, 68
23, 25, 23, 25, 31, 69

题解

#include <bits/stdc++.h> 
#define ll long long
using namespace std;
int t;
const int N=1e5+5;
ll n,a[N],q,sum1,sum2,num1,num2;
void solve(){
    cin>>n>>q;
    sum1=sum2=num1=num2=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]&1){
            num1++;
            sum1+=a[i];
        }
        else{
            num2++;
            sum2+=a[i];
        }
    }
    while(q--){
        int op,x;
        cin>>op>>x;
        if(op==0){
            if(x&1){
                sum2+=num2*x;
                cout<<sum1+sum2<<"\n";
                sum1+=sum2;
                sum2=0;
                num1+=num2;
                num2=0;
            }
            else{
                sum2+=num2*x;
                cout<<sum1+sum2<<"\n";
            }
        }
        else{
            if(x&1){
                sum1+=num1*x;
                cout<<sum1+sum2<<"\n";
                sum2+=sum1;
                sum1=0;
                num2+=num1;
                num1=0;
            }
            else{
                sum1+=num1*x;
                cout<<sum1+sum2<<"\n";
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    t=1;
    while(t--) solve();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值