일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 성화봉송
- 캘리그라피
- 영어회화 100일의 기적
- 인간이 그리는 무늬
- 위상정렬
- 창훈쓰다
- 생활코딩
- multiset
- 삼성 코딩테스트
- 평창동계올림픽
- 성화봉송주자
- 외판원 순회
- yolo
- BFS
- 안드로이드 스튜디오
- 다음 API
- DP
- 백트레킹
- upper_bound
- 다음 지도 api
- lower_bound
- 비트마스크
- boj
- MST
- 그리디 알고리즘
- 이분탐색
- Segment Tree
- BOJ 2098
- 다이나믹 프로그래밍
- 언어의 온도
- Today
- Total
Hoon222y
lazy propagation 본문
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstring>
#include <stack>
#include <string>
#include <set>
#include <map>
#include <math.h>
#define INF 1000000000
using namespace std;
vector<long long > tree;
vector<long long > a;
vector<long long> lazy;
int n, m, k;
long long init(int node,long long x,long long y)
{
if (x == y)
return tree[node] = a[x];
return tree[node] = init(node * 2, x, (x + y) / 2) + init(node * 2 + 1, (x + y) / 2 + 1, y);
}
void update_lazy(int node, long long x, long long y)
{
if (lazy[node] != 0)
{
tree[node] += (y - x + 1)*lazy[node];
if (x != y)
{
lazy[node * 2] += lazy[node];
lazy[node * 2 + 1] += lazy[node];
}
lazy[node] = 0;
}
}
long long query(int low, int high, int node, long long x, long long y)
{
update_lazy(node, x, y);
if (y < low || high < x)
return 0;
if (low <= x&&y <= high)
return tree[node];
long long mid = (x + y) / 2;
return query(low, high, node * 2, x, mid) + query(low, high, node * 2 + 1, mid + 1, y);
}
void update(int low, int high,long long val,int node, long long x, long long y)
{
update_lazy(node, x, y);
if (y < low || high < x)
return;
if (low <= x&&y <= high)
{
tree[node] += (y - x + 1)*val;
if (x != y)
{
lazy[node * 2] += val;
lazy[node * 2 + 1] += val;
}
return;
}
long long mid = (x + y) / 2;
update(low, high, val, node * 2, x, mid);
update(low, high, val, node * 2 + 1, mid + 1, y);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
int tmp;
a.resize(2*n);
tree.resize(5*n);
lazy.resize(5*n);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
}
init(1, 1, n);
m+=k;
while(m--){
scanf("%d", &tmp);
if (tmp == 1)
{
int a, b;
long long c;
scanf("%d%d%lld", &a, &b, &c);
update(a, b , c, 1, 1, n );
}
else if (tmp == 2)
{
int a, b;
scanf("%d%d", &a, &b);
printf("%lld\n", query(a, b , 1, 1, n));
}
}
return 0;
}
'코딩 > 자료구조&알고리즘' 카테고리의 다른 글
segment tree(2) - 이분탐색 (0) | 2016.09.20 |
---|---|
segment tree (0) | 2016.09.20 |
이분탐색 (Binary search) (0) | 2016.08.15 |
다이나믹 프로그래밍(DP)에 대해 알아보자. (0) | 2016.07.12 |
DFS와 BFS를 비교해보자. (0) | 2016.07.10 |