Cod sursa(job #2492242)

Utilizator alexradu04Radu Alexandru alexradu04 Data 14 noiembrie 2019 11:02:40
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;
const int R = 335;
vector<int> v[100005];
int a[100005],c[335],n,m;
bool p[R][1000005],viz[100005];
int st[100005],sf[100005],el[100005],ind;
void dfs(int x)
{
  viz[x] = 1;
  st[x] = ++ind;
  el[ind] = x;
  for (auto it: v[x])
    if (!viz[it])
      dfs(it);
  sf[x] = ind;
}
int block(int k)
{
  int poz = k/R;
  if (k%R != 0)
    poz++;
  return poz;
}
void update(int l, int r, int val)
{
  int beg = block(l);

  for (int i = (beg-1)*R+1; i<=beg*R; i++)
    p[beg][a[i]] = 0;
  for (int i = l; i<=r && i<=beg*R; i++)
    a[i]+=val;
  for (int i = (beg-1)*R+1; i<=beg*R; i++)
    p[beg][a[i]] = 1;

  if (beg == block(r))
    return;
  beg++;
  while (beg<block(r))
    c[beg++]+=val;

  for (int i = (beg-1)*R+1; i<=beg*R; i++)
    p[beg][a[i]] = 0;
  for (int i = (beg-1)*R+1; i<=r; i++)
    a[i]+=val;
  for (int i = (beg-1)*R+1; i<=beg*R; i++)
    p[beg][a[i]] = 1;

}
int query(int val)
{
  for (int i = 1; i<block(n); i++)
    if (val>=c[i] && p[i][val-c[i]])
    {
      for (int j = (i-1)*R+1; j<=i*R; j++)
        if (a[j] == val-c[i])
          return el[j];
    }
  for (int i = (block(n)-1)*R+1; i<=n; i++)
    if (a[i] == val-c[block(n)])
      return el[i];
  return -1;
}
int main()
{
  freopen("arbore.in","r",stdin);
  freopen("arbore.out","w",stdout);
  scanf("%d %d",&n,&m);
  for (int i = 1; i<n; i++)
  {
    int x,y;
    scanf("%d %d",&x,&y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(1);
  for (int i = 1; i<=m; i++)
  {
    int t;
    scanf("%d",&t);
    if (t == 1)
    {
      int k,val;
      scanf("%d %d",&k,&val);
      update(st[k],sf[k],val);
    }
    else
    {
      int val;
      scanf("%d",&val);
      printf("%d",query(val));
    }
  }
}