[wikioi]线段树练习
2014-10-19 10:40
281 查看
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; } } }
相关文章推荐
- wikioi1082【线段树练习 3 】
- wikioi 1082 线段树练习 3
- wikioi1082【线段树练习 3 】
- [wikioi]线段树练习 2
- 【wikioi1081】 线段树练习 2
- 【wikioi1082】 线段树练习 3
- wikioi 1080 线段树练习 树状数组
- 【SSLGZ 2646】线段树练习三
- 线段树练习1
- SSL P2647 线段树练习四
- Codevs 4927 线段树练习5
- [tem]线段树练习
- 【ZJOI2017 Round1练习】D2T3 counter(线段树)
- codevs1082线段树练习3(线段树)
- 线段树练习POJ 3264
- WikiOI 1217 借教室 (线段树lazy标记)(95分)
- 线段树练习
- 【对询问分块】CODEVS1080 线段树练习
- 2016夏季练习——线段树
- 线段树练习 区间合并