Cod sursa(job #3195206)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 20 ianuarie 2024 11:33:03
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#define sz 100000
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");

vector <int> vec[sz + 5];
int n;
int m;

int fr[sz + 5];
int lt[sz + 5];
int iv[sz*2 + 5];
int v[sz*2 + 5];
int o;
unordered_map<int,int> f[600];
int s[600];

int lg;
int bsz;


inline int bk(int ind)
{
    return ind/lg + (ind%lg!=0);
}
inline int get_b_start(int b_id)
{
    return (b_id-1)*lg + 1;
}

void dfs(int nod,int p)
{
    fr[nod]=++o;
    iv[o]=nod;
    for(auto& i : vec[nod])
        if(i!=p)
            dfs(i,nod);
    lt[nod]=++o;
    iv[o]=nod;
}

void update(int st,int dr,int val)
{
    int bst = bk(st);
    int bdr = bk(dr);
    if(bst==bdr)
    {
        for(int i = st;i<=dr;i++)
        {
            f[bst][v[i]]--;
            if(f[bst][v[i]]<=0)
                f[bst].erase(v[i]);
            v[i]+=val;
            f[bst][v[i]]++;
        }
        return;
    }
    for(int i = st;i<get_b_start(bst+1);i++)
    {
        f[bst][v[i]]--;
        if(f[bst][v[i]]<=0)
            f[bst].erase(v[i]);
        v[i]+=val;
        f[bst][v[i]]++;
    }
    for(int x = bst+1;x<bdr;x++)
        s[x]+=val;
    for(int i = get_b_start(bdr);i<=dr;i++)
    {
        f[bdr][v[i]]--;
        if(f[bdr][v[i]]<=0)
            f[bdr].erase(v[i]);
        v[i]+=val;
        f[bdr][v[i]]++;
    }

}

int query(int val)
{
    int sol = -1;
    for(int i = 1;i<=bsz; i++)
        if(f[i].find(val-s[i])!=f[i].end())
    {
        for(int x = get_b_start(i);x<get_b_start(i+1);x++)
            if(v[x] + s[i]==val)
                return iv[x];
    }
    return sol;
}



int main()
{
    fin>>n>>m;
    for(int i=1;i<n;i++)
    {
        int x,y;
        fin>>x>>y;
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
    dfs(1,0);
    lg=sqrt(o);
    bsz=o/lg + (o%lg!=0);
    for(int i=1;i<=o;i++)
        f[bk(i)][0]++;
    for(int i=1;i<=m;i++)
    {
        int tp;
        fin>>tp;
        if(tp==1)
        {
            int p,s;
            fin>>p>>s;
            update(fr[p],lt[p],s);
        }
        else
        {
            int s;
            fin>>s;
            fout<<query(s)<<'\n';
        }
    }
}