일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그리디 알고리즘
- 백트레킹
- 다음 지도 api
- 다이나믹 프로그래밍
- 이분탐색
- 성화봉송
- 인간이 그리는 무늬
- multiset
- DP
- 창훈쓰다
- 안드로이드 스튜디오
- 삼성 코딩테스트
- 평창동계올림픽
- 언어의 온도
- 영어회화 100일의 기적
- lower_bound
- 성화봉송주자
- 외판원 순회
- yolo
- BOJ 2098
- 비트마스크
- 다음 API
- upper_bound
- 생활코딩
- boj
- Segment Tree
- 위상정렬
- MST
- BFS
- 캘리그라피
- Today
- Total
Hoon222y
segment tree(2) - 이분탐색 본문
int find(int val, int node, int x, int y)
{
if (x == y)
return x;
if (seg[node * 2] >= val)
return find(val, node * 2, x, (x + y) / 2);
else
return find(val - seg[node * 2], node * 2 + 1, (x + y) / 2 + 1, y);
}
#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;
int n,m;
vector<long long > a;
vector<long long > seg;
long long init(int node ,int start , int end){
if(start == end){
return seg[node] = a[start];
}
int mid = (start + end) /2;
return seg[node] = init(node*2,start , mid) + init(node*2+1,mid+1 , end);
}
void update(int node , int x, int y , int index , long long diff){
if(index < x || index >y) return;
seg[node] += diff;
if(x != y){
int mid = (x+y)/2;
update(node*2 ,x,mid , index ,diff);
update(node*2+1 , mid+1 , y , index , diff);
}
}
int find(int val, int node, int x, int y)
{
if (x == y)
return x;
if (seg[node * 2] >= val)
return find(val, node * 2, x, (x + y) / 2);
else
return find(val - seg[node * 2], node * 2 + 1, (x + y) / 2 + 1, y);
}
int main(){
scanf("%d" , &n);
a.resize(n+2);
seg.resize(4*n);
for(int i=1;i<=n;i++){
scanf("%lld" , &a[i]);
}
init(1,1,n);
scanf("%d" ,&m);
int t1,t2,t3;
while(m--){
scanf("%d" , &t1);
if(t1 == 1){
scanf("%d %d" , &t2, &t3);
int diff = t3;
a[t2] +=t3;
update(1,1,n,t2,diff);
}else if(t1 == 2){
scanf("%d" , &t2);
printf("%d\n", find(t2, 1, 1, n));
}
}
}
'코딩 > 자료구조&알고리즘' 카테고리의 다른 글
LIS(Longest Increasing Subsequence) - 최장 증가 수열 (1) | 2017.03.06 |
---|---|
위상정렬(Topolosical Sort) (0) | 2017.02.24 |
segment tree (0) | 2016.09.20 |
lazy propagation (0) | 2016.09.20 |
이분탐색 (Binary search) (0) | 2016.08.15 |