Cod sursa(job #2953966)

Utilizator euyoTukanul euyo Data 12 decembrie 2022 19:38:40
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "arbore.in" );
ofstream fout( "arbore.out" );

const int DIM = 1e5 + 5;
const int BK = 320;
const int MAXS = 1e6 + 5;

vector<int> T[DIM];
int pre[DIM], sum[DIM], lazy[BK];
pair<int, int> range[DIM]; 
int idx = -1, len;

bitset<MAXS> f[BK];

void dfs( int u, int p ) {
  range[u].first = ++idx;
  pre[idx] = u;
  for ( auto v : T[u] ) {
	if ( v != p ) {
	  dfs(v, u);
	}
  }
  range[u].second = idx;
}

void updateRange( int l, int r, int bk, int add ) {
  int ll = bk * len, rr = min((bk + 1) * len - 1, idx - 1);
  for ( int i = ll; i <= rr; ++i ) f[bk][sum[i]] = 0;
  for ( int i = l; i <= r; ++i ) sum[i] += add;
  for ( int i = ll; i <= rr; ++i ) f[bk][sum[i]] = 1;
}
void update( int l, int r, int add ) {
  int bk1 = l / len, bk2 = r / len;
  
  if ( bk1 == bk2 ) {
	updateRange( l, r, bk1, add );
	return;
  }
  updateRange( l, (bk1 + 1) * len - 1, bk1, add );
  updateRange( bk2 * len, r, bk2, add );
  for ( ++bk1; bk1 < bk2; ++bk1 ) lazy[bk1] += add;
}

int main() {
  int n, m, t, u, v;
  
  fin >> n >> m;
  for ( int i = 1; i < n; ++i ) {
	fin >> u >> v;
	T[u].push_back(v);
	T[v].push_back(u);
  }
  len = sqrt(n);
  dfs(1, 0);
  ++idx;
  int nb = (idx - 1) / len;
  for ( int b = 0; b <= nb; ++b ) {
    f[b][0] = 1;
  }
  while ( m-- ) {
	fin >> t >> u; 
	if ( t == 1 ) {
	  fin >> v;
      update(range[u].first, range[u].second, v);
	} else {
	  bool ok = false;
	  for ( int b = 0; b <= nb && !ok; ++b ) {
		if ( u >= lazy[b] && f[b][u - lazy[b]] ) {
		  int lst = min((b + 1) * len, idx), node = 0;
		  for ( int i = b * len; i < lst && node == 0; ++i ) {
            if ( sum[i] + lazy[b] == u ) { 
			  node = pre[i];
			}
		  }
		  ok = true;
		  fout << node << "\n";
		}
	  }
   	  if ( !ok ) {
		fout << "-1\n";
	  }
	}
  }
  fin.close();
  fout.close();
  return 0;
}