Submission #91893

#TimeUsernameProblemLanguageResultExecution timeMemory
91893emil_physmathBirthday gift (IZhO18_treearray)C++17
56 / 100
85 ms888 KiB
#include <iostream> #include <stdio.h> #include <vector> using namespace std; const int MAXN=2005; int n, l, timer, a[MAXN], tin[MAXN], tout[MAXN]; vector<int> nei[MAXN], up[MAXN]; int lca(int u, int v); void dfs (int u, int p=1); bool upper (int u, int v); int main() { int m, q; cin>>n>>m>>q; for (int i=1; i<n; i++) { int u, v; scanf("%d%d", &u, &v); nei[u].push_back(v); nei[v].push_back(u); } l=1; while((1<<l)<=n) l++; for(int i=1; i<=n; i++) up[i].resize(l+1); dfs(1); for (int i=1; i<=m; i++) scanf("%d", a+i); int type, pos, L, R, v, ans; while (q--) { scanf("%d", &type); if (type==1) { scanf("%d%d", &pos, &v); a[pos]=v; } else { scanf("%d%d%d", &L, &R, &v); ans=-1; for (int i=L; i<R; i++) if (lca(a[i], a[i+1])==v) { ans=i; break; } if (ans==-1) { for (int i=L; i<=R; i++) if (a[i]==v) { ans=i; break; } if (ans==-1) printf("-1 -1\n"); else printf("%d %d\n", ans, ans); } else printf("%d %d\n", ans, ans+1); } } char I; cin >> I; return 0; } void dfs(int u, int p) { tin[u]=++timer; up[u][0]=p; for (int i=1; i<=l; i++) up[u][i]=up[up[u][i-1]][i-1]; for (int i=0; i<nei[u].size(); i++) if (nei[u][i]!=p) dfs(nei[u][i], u); tout[u]=++timer; } bool upper(int u, int v) { return tin[u]<=tin[v] && tout[u]>=tout[v]; } int lca(int u, int v) { if (upper(u, v)) return u; if (upper(v, u)) return v; for (int i=l; i>=0; i--) if (!upper (up[u][i], v)) u=up[u][i]; return up[u][0]; }

Compilation message (stderr)

treearray.cpp: In function 'void dfs(int, int)':
treearray.cpp:79:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i=0; i<nei[u].size(); i++)
                ~^~~~~~~~~~~~~~
treearray.cpp: In function 'int main()':
treearray.cpp:20:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &u, &v);
   ~~~~~^~~~~~~~~~~~~~~~
treearray.cpp:31:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", a+i);
   ~~~~~^~~~~~~~~~~
treearray.cpp:35:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &type);
   ~~~~~^~~~~~~~~~~~~
treearray.cpp:38:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d%d", &pos, &v);
    ~~~~~^~~~~~~~~~~~~~~~~~
treearray.cpp:43: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...