結果
問題 | No.875 Range Mindex Query |
ユーザー | syawacha |
提出日時 | 2019-09-06 21:51:25 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 293 ms / 2,000 ms |
コード長 | 2,191 bytes |
コンパイル時間 | 1,025 ms |
コンパイル使用メモリ | 93,368 KB |
実行使用メモリ | 10,368 KB |
最終ジャッジ日時 | 2024-06-24 17:37:41 |
合計ジャッジ時間 | 3,820 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 3 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 3 ms
5,376 KB |
testcase_07 | AC | 3 ms
5,376 KB |
testcase_08 | AC | 3 ms
5,376 KB |
testcase_09 | AC | 3 ms
5,376 KB |
testcase_10 | AC | 3 ms
5,376 KB |
testcase_11 | AC | 249 ms
9,728 KB |
testcase_12 | AC | 198 ms
6,912 KB |
testcase_13 | AC | 174 ms
10,112 KB |
testcase_14 | AC | 169 ms
9,984 KB |
testcase_15 | AC | 226 ms
10,240 KB |
testcase_16 | AC | 268 ms
10,112 KB |
testcase_17 | AC | 293 ms
10,368 KB |
testcase_18 | AC | 278 ms
10,368 KB |
ソースコード
#include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> typedef long long ll; using namespace std; typedef pair<ll, int> P; #define fs first #define sc second P min(P a, P b){ if(a.fs < b.fs){ return a; } else { return b; } } class SegmentTree{ public: int N; vector<P> node; P INF = P(1LL << 40, 100000000); //コンストラクタ SegmentTree(vector<P> v){ int sz = v.size(); N = 1; while(N < sz) N *= 2; node.resize(2 * N - 1, INF); for(int i = 0; i < sz; i++){ int k = i + N - 1; node[k] = v[i]; while(k > 0){ k = (k - 1) / 2; node[k] = min(node[k * 2 + 1], node[k * 2 + 2]); } } } //k番目の値(0_indexed)をaに変更 void update(int k, P a){ //葉の節点 k += N - 1; node[k] = a; //登りながら更新 while(k > 0){ k = (k - 1) / 2; node[k] = min(node[k * 2 + 1], node[k * 2 + 2]); } } //[a,b)の最小値 P query(int a, int b){ return Query(a, b, 0, 0, N); } P Query(int a, int b, int k, int l, int r){ if(r <= a || b <= l) return INF; if(a <= l && r <= b) return node[k]; else{ P v1 = Query(a, b, k * 2 + 1, l, (l + r) / 2); P v2 = Query(a, b, k * 2 + 2, (l + r) / 2, r); return min(v1, v2); } } void print(){ for(int i = 0; i < 2 * N - 1; i++){ //cout << "node[" << i << "] " << node[i] << endl; } } }; int main(){ int N, Q; cin >> N >> Q; vector<P> a(N); for(int i = 0; i < N; i++){ ll tmp; cin >> tmp; a[i] = P(tmp, i); } SegmentTree sg = SegmentTree(a); vector<int> ans; for(int i = 0; i < Q; i++){ int q, l, r; cin >> q >> l >> r; l--; r--; if(q == 1){ P L = sg.query(l, l + 1); P R = sg.query(r, r + 1); sg.update(l, P(R.fs, L.sc)); sg.update(r, P(L.fs, R.sc)); } else { //cout << (sg.query(l, r + 1)).sc << endl; ans.push_back((sg.query(l, r + 1)).sc + 1); } } for(int i : ans){ cout << i << endl; } return 0; }