Cod sursa(job #2654761)

Utilizator refugiatBoni Daniel Stefan refugiat Data 2 octombrie 2020 11:10:51
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <cmath>
using namespace std;
ifstream si("arbore.in");
ofstream so("arbore.out");
vector<int> g[100005];
bitset<1000005> b[325];
int k;
int first[100005], last[100005];
int e[100005], el[100005];
int start[325], stop[325], val[325];
bool viz[100005];
int nr;
void dfs(int nod) {
    viz[nod]=1;
    ++k;
    first[nod]=k;
    el[k]=nod;
    for(int i=0; i<g[nod].size(); ++i)
        if(!viz[g[nod][i]])
            dfs(g[nod][i]);
    last[nod]=k;
}
void update(int f, int l, int value) {
    for(int i=1; i<=nr; i++) {
        if(f<=start[i]&&stop[i]<=l)
            val[i]+=value;
        else if (f>start[i]&&stop[i]>l)
            for(int j=f; j<=l; j++) {
                e[j]+=value;
                b[i][e[j]]=1;
            }
        else if(f>start[i]&&f<=stop[i])
            for (int j=f; j<=stop[i]; j++) {
                e[j]+=value;
                b[i][e[j]]=1;
            }
        else if(stop[i]>l&&l>=start[i])
            for(int j=start[i]; j<=l; j++) {
                e[j]+=value;
                b[i][e[j]]=1;
            }
    }
}

int query(int s) {
    for(int i=1; i<=nr; i++) {
        if(s-val[i]<0)
            continue;
        if(b[i][s-val[i]])
            for(int j=start[i]; j<=stop[i]; j++)
                if(e[j]==s-val[i])
                    return el[j];
    }
    return -1;
}
int main() {
    int n, m;
    si>>n>>m;
    for(int i=1; i<n; i++){
        int x, y;
        si>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1);
    int r=sqrt(n);
    for(int i=1; i<=n; i++){
        if(i%r==1){
            stop[nr]=i-1;
            nr++;
            start[nr]=i;
        }
        b[nr][0]=1;
    }
    if(!stop[nr])
        stop[nr]=n;
    while(m--) {
        int o;
        si>>o;
        if(o==1){
            int p, s;
            si>>p>>s;
            update(first[p], last[p], s);
        }
        else {
            int s;
            si>>s;
            so<<query(s)<<'\n';
        }
    }
    return 0;
}