이번에는 시간초과랑 swap하는 것 때문에 몇 번 틀렸다..
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<long long> Tree;
vector<long long> arr;
vector<pair<int, pair<int, long long>>> query;
long long init(int start, int end, int node) {
if(start == end) return Tree[node] = arr[start];
int mid = (start+ end)/2;
return Tree[node] = init(start, mid, node * 2) + init(mid + 1, end, node * 2 +1);
}
void input() {
cin >> N >> M;
arr.resize(N, 0); // Resize & initialize as 0
Tree.resize(N * 4, 0); // init Tree
for(int i = 0; i < M; i++) {
int a,b;
long long c;
cin >> a >> b >> c;
query.push_back({a, {b,c}});
}
init(0, N-1, 1);
}
long long sum(int start, int end, int node, int left, int right) {
if (left > end || right < start) return 0;
if (left <= start && right >= end) return Tree[node];
int mid = (start + end) / 2;
return sum(start, mid, node * 2, left, right) +
sum(mid + 1, end, node * 2 + 1, left, right);
}
void modify(int start, int end, int node, int index, long long diff) {
if (index < start || index > end) return;
Tree[node] +=diff;
if (start == end) return;
int mid = (start + end) / 2;
if (start != end) {
modify(start, mid, node * 2, index, diff);
modify(mid + 1, end, node * 2 + 1, index, diff);
}
//Tree[node] = Tree[node * 2] + Tree[node * 2 + 1];
}
void solve() {
for (int i = 0; i < M; i++) {
int a, b;
long long c;
a = query[i].first;
b = query[i].second.first;
c = query[i].second.second;
if (a == 0) {
// sum
if(b > c ){
int c_tmp = int(c);
swap(b, c_tmp);
cout << sum(0, N - 1, 1, b - 1, c_tmp - 1) << "\n";
}
else cout << sum(0, N - 1, 1, b - 1, c - 1) << "\n";
} else if (a == 1) {
// modify
long long diff = c - arr[b - 1];
arr[b - 1] = c;
modify(0, N - 1, 1, b - 1, diff);
}
}
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
input();
solve();
return 0;
}