백준 1275번 커피숍2
문제링크: https://www.acmicpc.net/problem/1275
사용한 알고리즘: 펜윅트리
펜윅트리...를 아신다면 풀 수 있는 문제였습니다....
혹시 펜윅트리에대한 자세한 내용이 궁금한 분들은 아래 링크에 잘 정리되어 잇으니 참고해주세요.
https://www.acmicpc.net/blog/view/21
문제풀이는 다음과 같습니다.
(1) 먼저 N번 주어지는 수들로 펜윅트리를 업데이트(구성) 해줍니다.
(2) 이후 M번 주어지는 x,y,a,b 입력에서, x~y 수의 합을 출력해주고 a번째수를 b로 업데이트 해줍니다.
사용한 알고리즘: 펜윅트리
펜윅트리...를 아신다면 풀 수 있는 문제였습니다....
혹시 펜윅트리에대한 자세한 내용이 궁금한 분들은 아래 링크에 잘 정리되어 잇으니 참고해주세요.
https://www.acmicpc.net/blog/view/21
문제풀이는 다음과 같습니다.
(1) 먼저 N번 주어지는 수들로 펜윅트리를 업데이트(구성) 해줍니다.
(2) 이후 M번 주어지는 x,y,a,b 입력에서, x~y 수의 합을 출력해주고 a번째수를 b로 업데이트 해줍니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
#define ll long long | |
const ll MAX = 111111; | |
ll N, Q; | |
ll tree[MAX+1], arr[MAX+1]; | |
ll Li(ll x){ | |
return x&(-x); | |
} | |
ll sum(ll i){ | |
ll ans = 0; | |
while(i>0){ | |
ans += tree[i]; | |
i -= Li(i); | |
} | |
return ans; | |
} | |
void update(ll i, ll diff){ | |
while(i<=MAX){ | |
tree[i] += diff; | |
i += Li(i); | |
} | |
} | |
int main(){ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); | |
cin >> N >> Q; | |
for(ll i = 1; i <= N; ++i){ | |
ll num; | |
cin >> num; | |
arr[i] = num; | |
update(i,num); | |
} | |
while(Q--){ | |
ll x, y, a, b; | |
cin >> x >> y >> a >> b; | |
if(y<x) swap(x,y); | |
cout << sum(y)-sum(x-1) << '\n'; | |
ll dif = b-arr[a]; | |
update(a,dif); | |
arr[a] = b; | |
} | |
return 0; | |
} |
댓글
댓글 쓰기
긴 글 읽어주셔서 감사합니다.
궁금한게 있으시다면 댓글 달아주세요!