Submission #90966

#TimeUsernameProblemLanguageResultExecution timeMemory
90966davitmargBirthday gift (IZhO18_treearray)C++17
56 / 100
1655 ms87756 KiB
/* DEATH-MATCH Davit-Marg */ #include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <iterator> #include <ctype.h> #include <stdlib.h> #include <fstream> #define mod 1000000007ll #define LL long long #define LD long double #define MP make_pair #define PB push_back using namespace std; int n, m, q, used[300005],d[300005], tin[300005],a[300005], timer; vector<int> g[300005],ord; set<int> pos1[300005], pos2[300005]; vector<int> t; void build(int v,int l,int r) { if (l == r) { t[v] = ord[l]; return; } int m = (l + r) / 2; build(v * 2, l, m); build(v * 2 + 1, m + 1, r); if (d[t[v * 2]] <= d[t[v * 2 + 1]]) t[v] = t[v * 2]; else t[v] = t[v * 2 + 1]; } int query(int v,int l,int r,int i,int j) { int m = (l + r) / 2; if (l == i && r == j) return t[v]; if (j <= m) return query(v * 2, l, m, i, j); else if (i >= m + 1) return query(v * 2 + 1, m + 1, r, i, j); else { int m1 = query(v * 2, l, m, i, m); int m2 = query(v * 2+1, m + 1, r, m + 1, j); if (d[m1] <= d[m2]) return m1; else return m2; } } void dfs(int v) { used[v] = 1; tin[v] = ord.size(); ord.PB(v); for (int i = 0; i < g[v].size(); i++) { int to = g[v][i]; if (used[to]) continue; d[to] = d[v] + 1; dfs(to); ord.PB(v); } } int LCA(int a,int b) { if (tin[a] > tin[b]) swap(a,b); int res = query(1, 0, ord.size() - 1, tin[a], tin[b]); return res; } int main() { cin >> n >> m >> q; for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; g[a].PB(b); g[b].PB(a); } dfs(1); t.resize(ord.size()*4+10); build(1,0,ord.size()-1); for (int i = 0; i < m; i++) cin >> a[i]; for (int i = 0; i < m; i++) pos1[a[i]].insert(i); for (int i = 0; i < m - 1; i++) pos2[LCA(a[i],a[i+1])].insert(i); for (int ii = 0; ii < q; ii++) { int t; scanf("%d",&t); if (t == 1) { int p, v; scanf("%d%d", &p,&v); p--; pos1[a[p]].erase(p); if (p + 1 < n) pos2[LCA(a[p], a[p + 1])].erase(p); if (p - 1 >= 0) pos2[LCA(a[p], a[p - 1])].erase(p-1); a[p] = v; pos1[a[p]].insert(p); if (p + 1 < n) pos2[LCA(a[p], a[p + 1])].insert(p); if (p - 1 >= 0) pos2[LCA(a[p], a[p - 1])].insert(p - 1); } else { int L, R, v; scanf("%d%d%d", &L, &R,&v); pair<int, int> ans = MP( -1,-1 ); L--; R--; set<int>::iterator it; it = pos1[v].lower_bound(L); if (it != pos1[v].end() && (*it) <= R) ans = MP((*it)+1, (*it)+1); it = pos2[v].lower_bound(L); if (it != pos2[v].end() && (*it)+1 <= R) ans = MP((*it)+1, (*it)+2); cout << ans.first << " " << ans.second << endl; } } return 0; } /* 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 */

Compilation message (stderr)

treearray.cpp: In function 'void dfs(int)':
treearray.cpp:73:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < g[v].size(); i++)
                  ~~^~~~~~~~~~~~~
treearray.cpp: In function 'int main()':
treearray.cpp:118:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&t);
   ~~~~~^~~~~~~~~
treearray.cpp:122:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d%d", &p,&v);
    ~~~~~^~~~~~~~~~~~~~~
treearray.cpp:139:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d%d%d", &L, &R,&v);
    ~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...