백준 14438 수열과 쿼리 17

치즈·2022년 10월 10일

BOJ

목록 보기
6/45

세그먼트 트리 이용해주면 금세 풀 수 있을 문제?

#include <iostream>
#include <vector>
#define BIG 1e9;
using namespace std;

int N, M;
vector<long long> Tree;
vector<long long> arr;
vector<pair<int,pair<int, long>>> query;

void input(){
  cin >> N;
  arr.resize(N, 0);
  Tree.resize(N * 4, 0);
  for(int i = 0; i < N; i++) {
    cin >> arr[i];
  }
  cin >> M;
  for(int i = 0; i < M ; i++){
    int op, a;
    long long b;
    cin >> op >> a >> b;
    query.push_back({op, {a,b}});
  }
  
}
long long Min(long long a, long long b){
  return a < b? a:b;
}

long long init(int start, int end, int node){
  if(start == end) return Tree[node] = arr[start];
  int mid = (start + end)/2;
  Tree[node] = Min(init(start, mid, node * 2), init(mid + 1, end, node * 2 + 1));
  return Tree[node];
}

long long queryMin(int start, int end, int node, int left, int right){
  if(left > end || right < start) return BIG;
  if(left <= start && right >= end) return Tree[node];
  int mid = (start + end)/2;
  return Min(queryMin(start, mid, node * 2, left, right), queryMin(mid + 1, end, node * 2 + 1, left, right));
}

long long update(int start, int end, int node, int index, long long diff) {
  if(index < start || index > end) return Tree[node];
  if(start == end) return Tree[node] = diff;
  int mid = (start + end)/2;
  return Tree[node] = Min(update(start, mid, node * 2, index, diff) , update(mid + 1, end, node * 2 + 1,index, diff));
  
}
void solve(){
  for(int i = 0; i < M; i++){
    int op, a;
    long long b;
    op = query[i].first;
    a = query[i].second.first;
    b = query[i].second.second;

    if(op == 1){
      //update
      update(0, N-1, 1, a-1, b);
    }
    else if(op == 2){
      //minquery
      cout << queryMin(0, N-1, 1, a-1, b-1) << "\n";
    }
  }
}



int main(void){
  ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  input();
  init(0, N-1, 1);
  solve();
  return 0;
}
profile
차근차근 배워나가요

0개의 댓글