Cod sursa(job #3241421)

Utilizator divadddDavid Curca divaddd Data 30 august 2024 00:49:40
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5+2;
const int VMAX = 1e6+2;
const int BSIZE = sqrt(NMAX);
using pii = pair<int, int>;
int n,q,k,ord[NMAX],val[NMAX],lazy[BSIZE],mars[BSIZE];
vector<int> v[NMAX];
pii interval[NMAX];
bitset<VMAX> ap[BSIZE];

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

int ceil(int a, int b){
  return (a + b - 1) / b;
}

void dfs(int nod, int tata = -1){
  ord[++k] = nod;
  interval[nod] = {k, k};
  for(int fiu: v[nod]){
    if(fiu == tata){
      continue;
    }
    dfs(fiu, nod);
  }
  interval[nod].second = k;
}

void brut(int st, int dr, int kfc, int s){
  // cout << "brut(" << st << ", " << dr << ", " << kfc << ", " << s << ")\n";
  int l = 1 + kfc * BSIZE;
  int r = (kfc + 1) * BSIZE;
  // cout << kfc << " => [" << l << ", " << r << "]\n";
  // add lazy
  ap[kfc].reset();
  for(int i = l; i <= r; i++){
    val[i] += lazy[kfc];
    if(st <= i && i <= dr){
      val[i] += s;
    }
    // cout << val[i] << " ";
    ap[kfc][val[i]] = 1;
  }
  // cout << "\n";
  lazy[kfc] = 0;
  // cout << "done.\n";
}

void update(int l, int r, int s){
  /// val[ord[i]] += s , l <= i <= r
  int lbucket = (l - 1) / BSIZE, rbucket = (r - 1) / BSIZE;
  // cout << l << ", " << r << ", " << s << " -> " << lbucket << ", " << rbucket << "\n";
  if(lbucket == rbucket){
    brut(l, r, lbucket, s);
  }else{
    brut(l, (lbucket + 1) * BSIZE, lbucket, s);
    brut(1 + rbucket * BSIZE, r, rbucket, s);
    mars[lbucket + 1] += s;
    mars[rbucket] -= s;
  }
}

int find(int kfc, int s){
  int l = 1 + kfc * BSIZE;
  int r = (kfc + 1) * BSIZE;
  if(lazy[kfc] != 0){
    ap[kfc].reset();
    for(int i = l; i <= r; i++){
      val[i] += lazy[kfc];
      ap[kfc][val[i]] = 1;
    }
    lazy[kfc] = 0;
  }
  for(int i = l; i <= r; i++){
    if(val[i] == s){
      return ord[i];
    }
  }
  return -1;
}

int query(int s){
  int len = ceil(n, BSIZE);
  for(int i = 0; i < len; i++){
    mars[i] += mars[i-1];
    lazy[i] += mars[i];
    mars[i-1] = 0;
    if(s - lazy[i] >= 0 && ap[i][s - lazy[i]]){
      return find(i, s);
    }
  }
  mars[len - 1] = 0;
  return -1;
}

int main()
{
  fin >> n >> q;
  for(int i = 1; i < n; i++){
    int x, y;
    fin >> x >> y;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(1);
  int len = ceil(n, BSIZE);
  for(int i = 0; i < len; i++){
    int l = 1 + i * BSIZE;
    int r = (i + 1) * BSIZE;
    for(int j = l; j <= r; j++){
      ap[i][val[i]] = 1;
    }
  }
  while(q--){
    int t, p, s;
    fin >> t;
    if(t == 1){
      fin >> p >> s;
      // update(p, s);
      auto [l, r] = interval[p];
      update(l, r, s);
    }else{
      fin >> s;
      // find(s);
      fout << query(s) << "\n";
    }
  }
  return 0;
}