Submission #375318

#TimeUsernameProblemLanguageResultExecution timeMemory
375318ezdpDeda (COCI17_deda)C++14
140 / 140
786 ms9120 KiB
#pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #define endl '\n' #define pb push_back #define fr first #define sc second #define ll long long int #define ld long double #define bit(idx) idx&(-idx) #define bin(x) bitset<32>(x).to_string() #define all(A) A.begin(), A.end() #define de(x) cout << #x << " = " << x << endl; #define row vector<ll> #define row_matrix vector<ll> #define matrix vector<row_matrix> #define ordered_set_T ll using namespace std; using namespace __gnu_pbds; typedef tree<ordered_set_T, null_type, less<ordered_set_T>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; /// find_by_order(x) -> x-th element in the set /// order_of_key(x) -> how many elements are smaller than x /// insert(x) -> inserts x into the set const ll INF = 1e9 + 9; const ll MAXN = 262200; ll segmtree[2 * MAXN], n, q; void upd(int node, int l, int r, int x, int v){ if(l == r){ segmtree[node] = v; } else{ int m = (l + r) / 2; if(l <= x && x <= m) upd(2 * node, l, m, x, v); else upd(2 * node + 1, m + 1, r, x, v); segmtree[node] = min(segmtree[2 * node], segmtree[2 * node + 1]); } } ll qry(int node, int l, int r, int ql, int qr, int v){ if(r < ql || qr < l){ return INF; } else if(l == r && segmtree[node] <= v){ return l; } else if(ql <= l && r <= qr){ if(segmtree[node] <= v){ int m = (l + r) / 2; int tmp = qry(2 * node, l, m, ql, qr, v); return (tmp == INF ? qry(2 * node + 1, m + 1, r, ql, qr, v) : tmp); } else return INF; } else{ int m = (l + r) / 2; ll q1 = qry(2 * node, l, m, ql, qr, v); ll q2 = qry(2 * node + 1, m + 1, r, ql, qr, v); return min(q1, q2); } } void upd(ll x, ll v){ upd(1, 1, n, x, v); } ll qry(ll x, ll v) { return qry(1, 1, n, x, n, v); } int main(){ /// ios_base::sync_with_stdio(false); cin.tie(NULL); for(int i = 0; i < 2 * MAXN; i ++) segmtree[i] = INF; cin >> n >> q; for(int i = 0; i < q; i ++){ char t; int x, y; cin >> t >> x >> y; if(t == 'M'){ upd(y, x); } if(t == 'D'){ int tmp = qry(y, x); cout << (tmp == INF ? -1 : tmp) << endl; } } } /** */
#Verdict Execution timeMemoryGrader output
Fetching results...