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;

}