Cod sursa(job #2399442)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 7 aprilie 2019 14:58:47
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>

#define N 100005

using namespace std;

int n,m,x,y,c;
vector <int> g[N];
bitset <N> viz;

int a[N], b[350], f[N], l[N], la, sqr, v[N], lb;
bitset <1000005> ap[350];

void dfs(int nod){
    viz[nod] = 1;
    f[nod] = la;
    a[la++] = nod;
    for(int i : g[nod])
        if(!viz[i])
            dfs(i);
    l[nod]=la-1;
}

void actualizare(int buc){
    ap[buc].reset();
    for(int i = sqr*buc; i<= min((buc+1)*sqr - 1, la); ++i)
        ap[buc][v[a[i]]] = 1;
}

void actualizare(int st, int dr, int val){
    for(int i = st; i<= dr; ++i){
        if(i%sqr == 0 && dr-i+1>=sqr){
            b[i/sqr] += val;
            i+=sqr - 1;
        }
        else
            v[a[i]]+=val;
    }

    actualizare(st/sqr);
    actualizare(dr/sqr);
}

int cauta(int buc, int val){
    for(int i = sqr*buc; i<= min((buc+1)*sqr - 1, la); ++i)
        if(v[a[i]]==val)
            return a[i];
    return -1;
}

int cauta(int val){
    for(int i = 0; i <= lb; ++i)
        if(ap[i][val-b[i]])
            return cauta(i,val-b[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){
        scanf("%d%d", &x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }

    dfs(1);
    sqr = sqrt(la);
    lb=la/sqr;
    if(la%sqr!=0)
        ++lb;
    for(int i = 0; i < lb; ++i)
        ap[i][0]=1;

    for(int i = 0; i < m; ++i){
        scanf("%d%d", &c,&x);
        if(c==1){
            scanf("%d", &y);
            actualizare(f[x],l[x],y);
        }else
            cout<<cauta(x)<<"\n";
    }

    return 0;
}