제출 #537418

#제출 시각아이디문제언어결과실행 시간메모리
537418cig32Birthday gift (IZhO18_treearray)C++17
56 / 100
849 ms217652 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 1e6 + 10; const int MOD = 1e9 + 7; #define int long long mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count()); int rnd(int x, int y) { int u = uniform_int_distribution<int>(x, y)(rng); return u; } long long bm(long long b, long long p) { if(p==0) return 1; long long r = bm(b, p/2); if(p&1) return (((r*r) % MOD) * b) % MOD; return (r*r) % MOD; } vector<int> adj[MAXN]; pair<int, int> st[19][MAXN]; int l[MAXN], r[MAXN]; vector<int> e; int dep[MAXN]; void dfs(int node, int prv) { e.push_back(node); dep[node] = (prv == -1 ? 0 : dep[prv] + 1); for(int x: adj[node]) { if(x != prv) { dfs(x, node); e.push_back(node); } } } int lca_idx(int x, int y) { int m1 = min(l[x], l[y]), m2 = max(r[x], r[y]); int k = 32 - __builtin_clz(m2 - m1 + 1) - 1; return min(st[k][m1], st[k][m2 - (1<<k) + 1]).second; } void solve(int tc) { int n, m, q; cin >> n >> m >> q; for(int i=1; i<n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } dfs(1, -1); for(int i=0; i<e.size(); i++) st[0][i] = {dep[e[i]], e[i]}; for(int i=0; i<e.size(); i++) r[e[i]] = i; for(int i=e.size() - 1; i>=0; i--) l[e[i]] = i; for(int i=1; i<19; i++) { for(int j=0; j<e.size(); j++) { if(j + (1<<i) - 1 < e.size()) { st[i][j] = min(st[i-1][j],st[i-1][j+(1<<(i-1))]); } } } int a[m+1]; for(int i=1; i<=m; i++) cin >> a[i]; set<int> s[n+1]; for(int i=1; i<=m; i++) s[a[i]].insert(i); for(int i=1; i<=n; i++) s[i].insert(1e7); set<int> t[n+1]; for(int i=1; i<m; i++) t[lca_idx(a[i], a[i+1])].insert(i); for(int i=1; i<=n; i++) t[i].insert(1e7); for(int i=1; i<=q; i++) { int trrr; cin >> trrr; if(trrr == 1) { int pos, v; cin >> pos >> v; s[a[pos]].erase(pos); if(pos > 1) t[lca_idx(a[pos-1], a[pos])].erase(pos-1); if(pos < n) t[lca_idx(a[pos], a[pos+1])].erase(pos); a[pos] = v; s[a[pos]].insert(pos); if(pos > 1) t[lca_idx(a[pos-1], a[pos])].insert(pos-1); if(pos < n) t[lca_idx(a[pos], a[pos+1])].insert(pos); } else { int l, r, v; cin >> l >> r >> v; int x = -1, y = -1; auto it = s[v].lower_bound(l); if((*it) <= r) x = (*it), y = (*it); it = t[v].lower_bound(l); if((*it) < r) x = (*it), y = (*it) + 1; cout << x << ' ' << y << "\n"; } } } int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; for(int i=1; i<=t; i++) solve(i); } /* 5 4 4 1 2 3 1 3 4 5 3 4 5 2 3 2 1 3 1 1 3 5 2 3 4 5 2 1 3 1 */

컴파일 시 표준 에러 (stderr) 메시지

treearray.cpp: In function 'void solve(long long int)':
treearray.cpp:52:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |   for(int i=0; i<e.size(); i++) st[0][i] = {dep[e[i]], e[i]};
      |                ~^~~~~~~~~
treearray.cpp:53:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |   for(int i=0; i<e.size(); i++) r[e[i]] = i;
      |                ~^~~~~~~~~
treearray.cpp:57:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for(int j=0; j<e.size(); j++) {
      |                  ~^~~~~~~~~
treearray.cpp:58:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |       if(j + (1<<i) - 1 < e.size()) {
      |          ~~~~~~~~~~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...