Cod sursa(job #3222908)

Utilizator tudor_costinCostin Tudor tudor_costin Data 11 aprilie 2024 20:39:43
Problema Arbore Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
const int Nmax=1e5+5;
int SQRT;
int a[Nmax];
int n;
int ad[225];
bitset<1000005> f[350];
int sz[Nmax],pos[Nmax];
vector<int> v[Nmax];
vector<int> lin;
void dfs(int nod,int prev)
{
    sz[nod]=1;
    lin.push_back(nod);
    pos[nod]=lin.size()-1;
    for(int u:v[nod])
    {
        if(u!=prev)
        {
            dfs(u,nod);
            sz[nod]+=sz[u];
        }
    }
    return;
}
void update(int l,int r,int s)
{
    int lB=l/SQRT,rB=r/SQRT;
    if(lB==rB)
    {
        f[lB].reset();
        for(int i=l;i<=r;i++)
        {
            ///f[lB][a[i]]--;
            a[i]+=s;
            ///f[lB][a[i]]++;
        }
        for(int i=lB*SQRT;i<(lB+1)*SQRT;i++)
        {
            f[lB][a[i]]=1;
        }
        return;
    }
    f[lB].reset();
    f[rB].reset();
    for(int i=l;i<(lB+1)*SQRT;i++)
    {
        ///f[lB][a[i]]--;
        a[i]+=s;
        ///f[lB][a[i]]++;
    }
    for(int i=lB*SQRT;i<(lB+1)*SQRT;i++)
    {
        f[lB][a[i]]=1;
    }
    for(int i=r;i>=(rB)*SQRT;i--)
    {
        ///f[rB][a[i]]--;
        a[i]+=s;
        ///f[rB][a[i]]++;
    }
    for(int i=lB*SQRT;i<(lB+1)*SQRT;i++)
    {
            f[rB][a[i]]=1;
    }
    for(int b=lB+1;b<=rB-1;b++)
    {
        ad[b]+=s;
    }
}
int query(int val)
{
    int goodB=-1;
    for(int b=0;b<=n/SQRT;b++)
    {
        if(ad[b]>val) continue;
        int need=val-ad[b];
        if(f[b][need]==1)
        {
            goodB=b;
            break;
        }
    }
    if(goodB==-1) return -1;
    for(int i=goodB*SQRT;i<(goodB+1)*SQRT;i++)
    {
        if(a[i]==val-ad[goodB]) return lin[i];
    }
}
int main()
{
    int m;
    fin>>n>>m;
    SQRT=sqrt(n);
    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,0);
    while(m--)
    {
        int c;
        fin>>c;
        if(c==1)
        {
            int nod,s;
            fin>>nod>>s;
            update(pos[nod],pos[nod]+sz[nod]-1,s);
        }
        else
        {
            int val;
            fin>>val;
            fout<<query(val)<<'\n';
        }
    }
    return 0;
}