Cod sursa(job #2914516)

Utilizator JohnBoy97John Smith JohnBoy97 Data 20 iulie 2022 09:42:39
Problema Arbore Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");
int n, q;
int sbuk[400], st[400], dr[400], Bucket, ar[100002];
int L[100002], R[100002], mm, cr[100002], euler[100002];
bitset<1000002>mp[402];
vector<int>v[100002];
void dfs(int dad, int nod)
{
    ++mm;
    L[nod] = mm;
    euler[mm] = nod;
    for(int i = 0; i < v[nod].size(); ++i)
    {
        int vecin = v[nod][i];
        if(vecin == dad)
            continue;
        dfs(nod, vecin);
    }
    R[nod] = mm;
}
int main()
{
    f >> n >> q;
    for(int i = 1; i < n; ++i)
    {
        int a, b;
        f >> a >> b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(0, 1);
    Bucket = (int)sqrt(n);
    int pp = 1;
    st[1] = 1;
    for(int i = 1; i <= n; ++i)
    {
        cr[i] = pp;
        if(i % Bucket == 0)
        {
            dr[pp] = i;
            if(i < n)
            {
                ++pp;
                st[pp] = i + 1;
            }
        }
    }
    dr[pp] = n;
    for(int i = 1; i <= n; ++i)
        mp[cr[i]][0] = 1;
    for(int i = 1; i <= q; ++i)
    {
        int tip;
        f >> tip;
        if(tip == 1)
        {
            int a, b;
            f >> a >> b;
            int pz = L[a];
            for(int j = L[a]; j <= min(R[a], dr[cr[L[a]]]); ++j, ++pz)
            {
                mp[cr[j]][ar[j]] = 0;
                ar[j] += b;
            }
            for(int j = st[cr[L[a]]]; j <= dr[cr[L[a]]]; ++j)
                mp[cr[j]][ar[j]] = 1;
            while(pz <= R[a] && dr[cr[pz]] <= R[a])
            {
                sbuk[cr[pz]] += b;
                pz = dr[cr[pz]] + 1;
            }
            if(pz <= n)
            {
                for(int j = pz; j <= R[a]; ++j)
                {
                    mp[cr[j]][ar[j]] = 0;
                    ar[j] += b;
                }
                for(int j = st[cr[pz]]; j <= dr[cr[pz]]; ++j)
                    mp[cr[j]][ar[j]] = 1;
            }
        }
        else
        {
            int b;
            f >> b;
            bool gg = 0;
            for(int j = 1; j <= pp; ++j)
            {
                if(b >= sbuk[j] && mp[j][b - sbuk[j]] == 1)
                {
                    gg = 1;
                    for(int q = st[j]; q <= dr[j]; ++q)
                        if(ar[q] == b - sbuk[j])
                        {
                            g << euler[q] << '\n';
                            break;
                        }
                    break;
                }
            }
            if(!gg)
                g << -1 << '\n';
        }
    }
    return 0;
}