This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int LOG = 20;
const int MAXN = 200010;
int LCA(int U, int V);
class LCAStack
{
public:
void push(int node)
{
nodes.push_back( node );
prefixLCA.push_back( LCA( node , prefixLCA.back() ) );
}
void pop()
{
nodes.pop_back();
prefixLCA.pop_back();
}
int topNode() { return nodes.back(); }
int topLCA() { return prefixLCA.back(); }
bool empty() { return (int)nodes.size() == 1; }
LCAStack()
{
nodes.push_back( 0 );
prefixLCA.push_back( 0 );
}
protected:
vector<int> nodes;
vector<int> prefixLCA;
};
class LCAQueue
{
public:
void push(int node) { right.push( node ); }
void pop()
{
if( left.empty() )
{
while( !right.empty() )
{
left.push( right.topNode() );
right.pop();
}
}
left.pop();
}
int getLCA() { return LCA( left.topLCA() , right.topLCA() ); }
protected:
LCAStack left, right;
};
int n, m, q;
int v[MAXN];
int depth[MAXN];
int tab[LOG][MAXN];
vector<int> adj[MAXN];
void DFS(int node, int p, int d)
{
depth[node] = d;
tab[0][node] = p;
for(int k = 1 ; k < LOG ; k++)
tab[k][node] = tab[k - 1][tab[k - 1][node]];
for(int i = 0 ; i < (int)adj[node].size() ; i++)
{
int viz = adj[node][i];
if( viz != p )
DFS( viz , node , d + 1 );
}
}
int LCA(int U, int V)
{
if( U == 0 || V == 0 )
return max( U , V );
if( depth[U] < depth[V] )
swap( U , V );
int d = depth[U] - depth[V];
for(int k = 0 ; k < LOG ; k++)
if( d & (1 << k) ) U = tab[k][U];
if( U == V ) return U;
for(int k = LOG - 1 ; k >= 0 ; k--)
if( tab[k][U] != tab[k][V] ) U = tab[k][U], V = tab[k][V];
return tab[0][U];
}
void update(int pos, int node) { v[pos] = node; }
void query(int l, int r, int node, int& ansL, int& ansR)
{
ansL = ansR = -1;
for(int i = l ; i <= r ; i++)
{
if( v[i] == node )
{
ansL = ansR = i;
return;
}
}
LCAQueue q;
int i = l, j = l - 1;
while( j <= r )
{
int L = q.getLCA();
if( L == node )
{
ansL = i, ansR = j;
return;
}
if( depth[L] >= depth[node] ) q.push( v[++j] );
else q.pop(), i++;
}
}
int main()
{
scanf("%d %d %d",&n,&m,&q);
depth[0] = n + 1;
for(int i = 1 ; i < n ; i++)
{
int U, V;
scanf("%d %d",&U,&V);
adj[U].push_back( V );
adj[V].push_back( U );
}
DFS( 1 , 1 , 0 );
for(int i = 1 ; i <= m ; i++)
scanf("%d",&v[i]);
for(int i = 1 ; i <= q ; i++)
{
int type;
scanf("%d",&type);
if( type == 1 )
{
int pos, node;
scanf("%d %d",&pos,&node);
update( pos , node );
}
if( type == 2 )
{
int l, r, node;
scanf("%d %d %d",&l,&r,&node);
int ansL, ansR;
query( l , r , node , ansL , ansR );
printf("%d %d\n",ansL,ansR);
}
}
}
Compilation message (stderr)
treearray.cpp: In function 'int main()':
treearray.cpp:152:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
152 | scanf("%d %d %d",&n,&m,&q);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~
treearray.cpp:159:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
159 | scanf("%d %d",&U,&V);
| ~~~~~^~~~~~~~~~~~~~~
treearray.cpp:168:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
168 | scanf("%d",&v[i]);
| ~~~~~^~~~~~~~~~~~
treearray.cpp:173:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
173 | scanf("%d",&type);
| ~~~~~^~~~~~~~~~~~
treearray.cpp:178:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
178 | scanf("%d %d",&pos,&node);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
treearray.cpp:185:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
185 | scanf("%d %d %d",&l,&r,&node);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |