백준 2268 수들의 합7

치즈·2022년 10월 8일

BOJ

목록 보기
5/45

이번에는 시간초과랑 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;
}
profile
차근차근 배워나가요

0개의 댓글