http://codevs.cn/problem/1080/

#include <vector>
#include <iostream>
#include <string.h> using namespace std; const int MAXN = 100000; struct Line {
int left, right;
int n;
}; Line tree[MAXN * 3]; void buildtr(int left, int right, int k) {
tree[k].left = left;
tree[k].right = right;
tree[k].n = 0;
if (left == right) return;
int mid = (left + right) / 2;
buildtr(left, mid, k * 2);
buildtr(mid + 1, right, k * 2 + 1);
} int query(int x, int k) {
if (tree[k].left == x && tree[k].right == x) {
return tree[k].n;
}
int mid = (tree[k].left + tree[k].right) / 2;
if (x <= mid) return query(x, k * 2);
else return query(x, k * 2 + 1);
} int query(int l, int r, int k) {
if (tree[k].left == l && tree[k].right == r) {
//cout << "k:" << k << ",l" << l << "r," << r << ",n:" << tree[k].n << endl;
return tree[k].n;
}
int mid = (tree[k].left + tree[k].right) / 2;
if (r <= mid) {
return query(l, r, k * 2);
} else if (l > mid) {
return query(l, r, k * 2 + 1);
} else {
return query(l, mid, k * 2) + query(mid + 1, r, k * 2 + 1);
}
} int update(int x, int y, int k) {
int diff = 0;
if (tree[k].left == x && tree[k].right == x) {
diff = y - tree[k].n;
tree[k].n = y;
return diff;
}
int mid = (tree[k].left + tree[k].right) / 2;
if (x <= mid) {
diff = update(x, y, k * 2);
} else {
diff = update(x, y, k * 2 + 1);
}
tree[k].n += diff;
return diff;
} int add(int l, int r, int x, int k) {
int diff = 0;
if (tree[k].left == tree[k].right) {
diff = x;
tree[k].n += x;
//cout << "diff:" << x << endl;
return x;
}
int mid = (tree[k].left + tree[k].right) / 2;
if (mid >= r) {
diff = add(l, r, x, k * 2);
} else if (mid < l) {
diff = add(l, r, x, k * 2 + 1);
} else {
diff += add(l, mid, x, k * 2);
diff += add(mid + 1, r, x, k * 2 + 1);
}
tree[k].n += diff;
return diff;
} int main() {
int n;
cin >> n;
memset(tree, sizeof(tree), 0);
buildtr(1, n, 1);
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
update(i, x, 1);
}
int m;
cin >> m;
while (m--) {
int c, x, y;
cin >> c >> x >> y;
if (c == 1) {
add(x, x, y, 1);
} else if (c == 2) {
int res = query(x, y, 1);
cout << res << endl;
}
}
}

  

[wikioi]线段树练习的更多相关文章

  1. [wikioi]线段树练习 2

    http://codevs.cn/problem/1081/ #include <vector> #include <iostream> #include <string ...

  2. 【wikioi】2216 行星序列(线段树)

    http://wikioi.com/problem/2216/ 这题太让我感动了QAQ,让我找到了我一直以来写线段树的错误!!!! 就是,pushdown一定要放在最前面!要不然顺序会错.也就是说,当 ...

  3. 【wikioi】1191 数轴染色(线段树+水题)

    http://wikioi.com/problem/1191/ 太水的线段树了,敲了10分钟就敲完了,但是听说还有一种并查集的做法?不明觉厉. #include <cstdio> #inc ...

  4. wikioi 1080 线段树练习 树状数组

    1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现 ...

  5. Wikioi 1081 线段树成段更新单点查询

    线段树练习飘逸的写法,自从自己改成这样的写法之后,线段树就没再练过,如今最终练得上了. 由于这里查询仅仅是查询了叶子结点,所以pushUp函数就用不上了,只是我没去掉之前是3ms.去掉之后反而变成4m ...

  6. [wikioi]线段覆盖

    http://wikioi.com/problem/1214/ 这道题也归为贪心了.我也不是很能分辨,但想法确实是:1.有阶段最优化性:2.前一状态和后一状态有关系. 想法:1.排个序是很自然的想法, ...

  7. 小结:线段树 & 主席树 & 树状数组

    概要: 就是用来维护区间信息,然后各种秀智商游戏. 技巧及注意: 一定要注意标记的下放的顺序及影响!考虑是否有叠加或相互影响的可能! 和平衡树相同,在操作每一个节点时,必须保证祖先的tag已经完全下放 ...

  8. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  9. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

随机推荐

  1. Java抽象类和抽象方法例子

    题目:定义Shape类表示一般二维图形.Shape具有抽象方法area和perimeter,分别计算形状的面积和周长.试定义一些二维形状类(如矩形.三角形.圆形等),这些均为Shape类的子类并计算出 ...

  2. Silverlight形状、画笔、变换、图像处理、几何图形

    1.形状(Ellipse.Line.Path.Polygon.Polyline 和 Rectangle) <UserControl x:Class="SharpStudy.MainPa ...

  3. 51nod贪心算法入门-----完美字符串

    约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...

  4. Translation001——android

    请尊重原创,转载请注明出处: Author:KillerLegend Link:http://www.cnblogs.com/killerlegend/ BEGIN****************** ...

  5. 为checkboxSelectionModel赋值

    store.on('load', function(store, records, options) { sm.clearSelections();   //清空数据 Ext.each(records ...

  6. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  7. python autopy

    今天学习了python autopy 主要包括alert,color,mouse,key,bitmap,screen等的操作 文档在http://www.autopy.org/documentatio ...

  8. Java从入门到精通——技巧篇之利用dom4j取出XML文件中的数据

    在我们做项目的时候会经常用到XML文件用来配置系统,XML让系统更加的具有了灵活性,Java如何从XML中取出我们想要的数据呢?下面是我利用DOM4J来实现取出XML文件中的数据. XML文件 < ...

  9. GOOGLE影像地图

    卫星地图高清 //  

  10. Ffmpeg 定位文件(seek file)

    有朋友问到ffmpeg播放文件如何定位问题,我想到应该还有一些新手朋友对这一块比较陌生.ffmpeg定位问题用到seek方法,代码 如下: void SeekFrame(AVFormatContext ...