Cod sursa(job #1747724)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 25 august 2016 14:58:10
Problema Arbore Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <fstream>
#include <algorithm>
#include <bitset>

using namespace std;

const int kMaxN = 100005;
const int kMaxB = sqrt(kMaxN);
const int kStep = sqrt(kMaxN);
const int kMaxVal = 1000005;

int n, m;
vector<int> graph[kMaxN];
int order[kMaxN];
int time_in[kMaxN];
int time_out[kMaxN];
int current[kMaxN];
int add[kMaxB];
bitset<kMaxVal> exists[kMaxB];

inline int BucketBegin(int i) { return (i - 1) * kStep + 1; }
inline int BucketEnd(int i) { return min(n, i * kStep); }
inline int BucketId(int i) { return (i - 1) / kStep + 1; }

void Dfs(int x, int p) {
  ++order[0];
  order[order[0]] = x;
  time_in[x] = order[0]; 
  for(auto y : graph[x]) {
    if(y != p) {
      Dfs(y, x);
    }
  }
  time_out[x] = order[0];
}

void Update(int l, int r, int s) {
  int id_l = BucketId(l), id_r = BucketId(r);
  
  if(id_l == id_r) {
    for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 0;
    for(int i = l; i <= r; i++) current[i] += s;
    for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 1;
    return;
  }
  
  for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 0;
  for(int i = l; i <= BucketEnd(id_l); i++) current[i] += s;
  for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 1;
  
  for(int i = BucketBegin(id_r); i <= BucketEnd(id_r); i++) exists[id_r][current[i]] = 0;
  for(int i = BucketBegin(id_r); i < r; i++) current[i] += s;
  for(int i = BucketBegin(id_r); i <= BucketEnd(id_r); i++) exists[id_r][current[i]] = 1;
  
  for(int i = id_l + 1; i <= id_r - 1; i++) add[i] += s;
}

int Query(int s) {
  for(int i = 1; i <= BucketId(n); i++) {
    if(add[i] <= s && exists[i][s - add[i]]) {
      for(int j = BucketBegin(i); j <= BucketEnd(i); j++) {
        if(current[j] + add[i] == s) {
          return order[j];
        }
      }
    }
  }
  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);
    graph[x].push_back(y);
    graph[y].push_back(x);
  }
  
  Dfs(1, 0);
  while(m--) {
    int op, x, s;
    scanf("%d", &op);
    if(op == 1) {
      scanf("%d %d", &x, &s);
      Update(time_in[x], time_out[x], s);
    } else {
      scanf("%d", &s);
      printf("%d\n", Query(s));
    }
  }
  return 0;
}