baekjoon
5676번 음주 코딩
gokimkh
2022. 3. 22. 15:46
https://www.acmicpc.net/problem/5676
5676번: 음주 코딩
각 테스트 케이스마다 곱셈 명령의 결과를 한 줄에 모두 출력하면 된다. 출력하는 i번째 문자는 i번째 곱셈 명령의 결과이다. 양수인 경우에는 +, 음수인 경우에는 -, 영인 경우에는 0을 출력한다.
www.acmicpc.net
세그먼트 트리를 이용해 곱을 구하는 문제이다. 하지만 모듈러 연산이 적용 안 되기 때문에 곱을 구하면 오버플로가 난다. 따라서
문제의 답을 잘 보면 양수 일 땐 +, 음수 일 땐 -, 0일 땐 0을 출력하는 것이므로 연산을 다 하지 않고 값이 들어왔을 때 음수인지 양수인지 0인지만 판단 해주면 된다.
#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<l>
using namespace std;
l init(int st,int en,int node,vc &v,vc &tree){
if(st == en){
if(v[st] < 0) tree[node] = -1;
else if(v[st] > 0) tree[node] = 1;
else tree[node] = 0;
return tree[node];
}
int mid = (st + en) / 2;
return tree[node] = init(st,mid,node*2,v,tree) * init(mid+1,en,node*2+1,v,tree);
}
l mul(int st,int en,int node,int L,int R,vc &v,vc &tree){
if(R < st || L > en) return 1;
if(L <= st && en <= R) return tree[node];
int mid = (st + en) / 2;
return mul(st,mid,node*2,L,R,v,tree) * mul(mid+1,en,node*2+1,L,R,v,tree);
}
void Update(int st,int en,int node,int idx,l val,vc &v,vc &tree){
if(idx < st || idx > en) return;
if(st == en){
if(val < 0) tree[node] = v[idx] = -1;
else if(val > 0) tree[node] = v[idx] = 1;
else tree[node] = v[idx] = 0;
return;
}
int mid = (st + en) / 2;
Update(st,mid,node*2,idx,val,v,tree);
Update(mid+1,en,node*2+1,idx,val,v,tree);
tree[node] = tree[node*2] * tree[node*2+1];
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,k,x,y;
char a;
while(cin >> n >> k){
vc v(n),tree(n*4);
for(auto &i : v)
cin >> i;
init(0,n-1,1,v,tree);
while(k--){
cin >> a >> x >> y;
if(a == 'C') Update(0,n-1,1,x-1,y,v,tree);
else{
l temp = mul(0,n-1,1,x-1,y-1,v,tree);
if(temp < 0) cout << "-";
else if(temp > 0) cout << "+";
else cout << "0";
}
}
cout << "\n";
}
}