https://www.acmicpc.net/problem/11505
요즘 세그트리부터 공부해볼라고 푸는 중인데 왜 TLE뜰까 아래는 코드임
---
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
#define endl '\n'
using namespace std;
using ll = long long;
const int MOD = 1e9+7;
struct SegTree {
int n;
vector<ll> t;
SegTree(int n) {
this->n = n;
t = vector<ll>(4*n, 1);
}
SegTree(const SegTree& s) {
this->n = s.n;
t = vector<ll>(4*n, 1);
}
SegTree() {}
void build(vector<ll> a, int curr, int tl, int tr) {
if(tl == tr) {
t[curr] = a[tl];
return;
}
int tm = (tl + tr)/2;
build(a, curr*2, tl, tm);
build(a, curr*2+1, tm+1, tr);
t[curr] = (t[curr*2]*t[curr*2+1])%MOD;
}
void update(int curr, int tl, int tr, int idx, ll new_val) {
if(tl == tr) {
t[curr] = new_val;
return;
}
int tm = (tl + tr)/2;
if(idx <= tm) {
update(curr*2, tl, tm, idx, new_val);
} else {
update(curr*2+1, tm+1, tr, idx, new_val);
}
t[curr] = (t[curr*2]*t[curr*2+1])%MOD;
}
ll get_query(int curr, int tl, int tr, int l, int r) {
if(l > r) return 1;
if(tl == l && tr == r) return t[curr];
int tm = (tl+tr)/2;
return (get_query(curr*2, tl, tm, l, min(tm, r))
*get_query(curr*2+1, tm+1, tr, max(tm+1, l), r))%MOD;
}
};
int n, m, k, q;
vector<ll> arr(1000005);
int main() {
fastio;
cin >> n >> m >> k;
for(int i=0; i<n; i++) cin >> arr[i];
SegTree seg(n);
seg.build(arr, 1, 0, n-1);
q = m + k;
for(int i=0; i<q; i++) {
int a, b, c;
cin >> a >> b >> c;
if(a == 1) {
seg.update(1, 0, n-1, b-1, c);
}
else {
cout << seg.get_query(1, 0, n-1, b-1, c-1) << endl;
}
}
return 0;
}
-틀- - dc App
vector말고 ll arr[1000005]하니까 통과하네 씨
아 씨 vector &a 해야됐네
안하면 call by value라 복사하는데 O(n)이 들었을거에요 ㅠㅠ