D - All Assign Point Add

本文介绍了一个关于序列操作的问题D-AllAssignPointAdd,包括为序列元素分配值、增加值及打印值的查询处理。通过示例说明了算法实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D - All Assign Point Add

Score : 400400 points

Problem Statement

You are given a sequence A = (A_1, A_2, \dots, A_N)A=(A1​,A2​,…,AN​) of length NN.

Given QQ queries, process all of them in order. The qq-th (1\leq q\leq Q)(1≤q≤Q) query is in one of the following three formats, which represents the following queries:

  • 1\ x _ q1 xq​: assign x_qxq​ to every element of AA.
  • 2\ i _ q\ x _ q2 iq​ xq​: add x_qxq​ to A _ {i _ q}Aiq​​.
  • 3\ i _ q3 iq​: print the value of A _ {i _ q}Aiq​​.

Constraints

  • 1 \leq N \leq 2\times10^51≤N≤2×105
  • 1 \leq Q \leq 2\times10^51≤Q≤2×105
  • 0 \leq A _ i \leq 10^9\ (1\leq i\leq N)0≤Ai​≤109 (1≤i≤N)
  • If the qq-th (1\leq q\leq Q)(1≤q≤Q) query is in the second or third format, 1 \leq i _ q \leq N1≤iq​≤N.
  • If the qq-th (1\leq q\leq Q)(1≤q≤Q) query is in the first or second format, 0 \leq x _ q \leq 10^90≤xq​≤109.
  • There exists a query in the third format.
  • All values in the input are integers.

Input

The input is given from Standard Input in the following format:

NN
A_1A1​ A_2A2​ \dots… A_NAN​
QQ
\operatorname{query}_1query1​
\operatorname{query}_2query2​
\vdots⋮
\operatorname{query}_QqueryQ​

Here, \operatorname{query}_qqueryq​ denotes the qq-th query, which is in one of following formats: 1 x2 i x, and 3 i.

Output

Print XX lines, where XX is the number of qq's (1\leq q\leq Q)(1≤q≤Q) such that \operatorname{query}_qqueryq​ is in the third format. The jj-th (1\leq j\leq X)(1≤j≤X) line should contain the answer to the jj-th such query.


Sample Input 1 Copy

Copy

5
3 1 4 1 5
6
3 2
2 3 4
3 3
1 1
2 3 4
3 3

Sample Output 1 Copy

Copy

1
8
5

Initially, A=(3,1,4,1,5)A=(3,1,4,1,5). The queries are processed as follows:

  • A_2=1A2​=1, so print 11.
  • Add 44 to A_3A3​, making A=(3,1,8,1,5)A=(3,1,8,1,5).
  • A_3=8A3​=8, so print 88.
  • Assign 11 to every element of AA, making A=(1,1,1,1,1)A=(1,1,1,1,1).
  • Add 44 to A_3A3​, making A=(1,1,5,1,1)A=(1,1,5,1,1).
  • A_3=5A3​=5, so print 55.

Sample Input 2 Copy

Copy

1
1000000000
8
2 1 1000000000
2 1 1000000000
2 1 1000000000
2 1 1000000000
2 1 1000000000
2 1 1000000000
2 1 1000000000
3 1

Sample Output 2 Copy

Copy

8000000000

Note that the elements of AA may not fit into a 3232-bit integer type.


Sample Input 3 Copy

Copy

10
1 8 4 15 7 5 7 5 8 0
20
2 7 0
3 7
3 8
1 7
3 3
2 4 4
2 4 9
2 10 5
1 10
2 4 2
1 10
2 3 1
2 8 11
2 3 14
2 1 9
3 8
3 8
3 1
2 6 5
3 7

Sample Output 3 Copy

Copy

7
5
7
21
21
19
10

#include <iostream>

#include <queue>
#include <map>
using namespace std;

const int N = 2e5 + 5;
map<int,pair<int, unsigned long long>> m;
long long tag=0,ti=0;

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		long long e;
		cin >>e;
		m[i].first = 0;
		m[i].second = e;
	}
	int q;
	cin >> q;
	int t;
	for (int i = 1; i <= q; i++)
	{
		cin >> t;
		if (t == 1)
		{
			cin >> tag;
			ti = i;//tag最近的更新操作是第ti次
		}
		else if (t == 2)
		{
			unsigned long long o, x;
			cin >> o >> x;
			if(m[o].first<ti)//如果tag更新的操作在上一次给m[o]加值之后,则加值应先置零在加
				m[o].second = x;
			else//如果tag更新的操作在上一次给m[o]加值之后,则在上次值后加值
				m[o].second += x;
			m[o].first = i;


		}
		else if (t == 3)
		{
			int p;
			cin >> p;
			if (m[p].first < ti)
			{
				cout << tag << endl;
			}
			else
			{
				cout << tag + m[p].second << endl;
			}

		}
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linalw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值