codeforces 315 B.Sereja and Array

简介: codeforces 315 B.Sereja and Array

地址



B. Sereja and Array

time limit per test 1 second

memory limit per test 256 megabytes

input standard input

output standard output

Sereja has got an array, consisting of n integers, a1, a2, ..., an. Sereja is an active boy, so he is now going to complete m operations. Each operation will have one of the three forms:


Make vi-th array element equal to xi. In other words, perform the assignment avi = xi.

Increase each array element by yi. In other words, perform n assignments ai = ai + yi (1 ≤ i ≤ n).

Take a piece of paper and write out the qi-th array element. That is, the element aqi.

给N个元素的数组, 有三种操作 1 是把第i个元素变成v,  2是所有元素都加V, 3 询问第i个元素的值。


我用了树状数组,理论上用线段树也可以做,但树状数组明显要好写点,感觉还要比线段树快些。


树状数组原本用来就区间的和,只要稍微改进一下就和更新点,求点的值, 我们如果更新点x为v(当原来点是0事) 我们update(x , v) 和 update(x, -v) , 这样我们求1到x的和是求到的就是x点的值。

//cf 315 B Sereja and Array
//2013-06-13-20.02
#include <stdio.h>
#include <string.h>
const int maxn = 100005;
int a[maxn];
int n;
inline int lowbit(int x)
{
    return x&-x;
}
int update(int x, int v)
{
    while (x <= n+1)
    {
        a[x] += v;
        x += lowbit(x);
    }
    return 0;
}
int getsum(int x)
{
    int sum = 0;
    while (x)
    {
        sum += a[x];
        x -= lowbit(x);
    }
    return sum;
}
int main()
{
    int m;
    while (scanf("%d %d", &n, &m) != EOF)
    {
        memset(a, 0, sizeof(a));
        int t, op, x, v;
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &t);
            update(i, t);
            update(i+1, -t);
        }
        while (m--)
        {
            scanf("%d", &op);
            if (op == 1)
            {
                scanf("%d %d", &x, &v);
                int tmp = getsum(x);
                update(x, -tmp);
                update(x+1, tmp);
                update(x, v);
                update(x+1, -v);
            }
            else if (op == 2)
            {
                scanf("%d", &v);
                update(1, v);
            }
            else
            {
                scanf("%d", &x);
                printf("%d\n", getsum(x));
            }
        }
    }
    return 0;
}
目录
相关文章
codeforces 318 A.Even Odds B.Sereja and Array
codeforces 318 A.Even Odds B.Sereja and Array
38 0
codeforces 299 A. Ksusha and Array
题目就是让你找出一个数组中可以将这个数组中所有数整除的数,很明显,如果存在,这个数肯定是最小的一个。
46 0
|
Perl
Codeforces 1312E. Array Shrinking(区间DP 栈)
Codeforces 1312E. Array Shrinking(区间DP 栈)
100 0
|
7月前
|
Python
使用array()函数创建数组
使用array()函数创建数组。
144 3
|
20天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
101 67
|
2月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
2月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
96 2
|
2月前
|
存储 JavaScript 前端开发
JavaScript Array(数组) 对象
JavaScript Array(数组) 对象
35 3
|
2月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)