Cod sursa(job #3231346)

Utilizator Anul2024Anul2024 Anul2024 Data 25 mai 2024 21:27:51
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#include <unordered_map>
#include <cmath>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin ("arbore.in");
ofstream fout ("arbore.out");
int n,q,nod,k,b1,b2,i,j,lg,x,y,ch,nrb,val;
int v[100001],s[100001],poz[100001],nr[100001],sumb[318],l[318],r[318];
unordered_map <int,int> fr[318];
vector <int> mch[100001];
bitset <100001> viz;
void dfs (int nod)
{
    viz[nod]=1;
    k++;
    v[k]=nod;
    poz[nod]=k-1;
    nr[nod]=1;
    for (int i=0; i<mch[nod].size (); i++)
    {
        int vecin=mch[nod][i];
        if (!viz[vecin])
        {
            dfs (vecin);
            nr[nod]+=nr[vecin];
        }
    }
}
void update (int st,int dr,int val)
{
    b1=st/lg;
    b2=dr/lg;
    for (i=st; i<=r[b1]; i++)
    {
        fr[b1][s[i]+sumb[b1]]--;
        if (fr[b1][s[i]+sumb[b1]]==0)
            fr[b1].erase (fr[b1].find (s[i]+sumb[b1]));
        s[i]+=val;
        fr[b1][s[i]+sumb[b1]]++;
    }
    if (b1!=b2)
    {
        for (i=l[b2]; i<=dr; i++)
        {
            fr[b2][s[i]+sumb[b2]]--;
            if (fr[b2][s[i]+sumb[b2]]==0)
                fr[b2].erase (fr[b2].find (s[i]+sumb[b2]));
            s[i]+=val;
            fr[b2][s[i]+sumb[b2]]++;
        }
    }
    for (i=b1+1; i<b2; i++)
        sumb[i]+=val;
}
int query (int x)
{
    for (i=0; i<=nrb; i++)
    {
        if (fr[i][x-sumb[i]]>0)
        {
            for (j=l[i]; j<=r[i]; j++)
            {
                if (s[j]+sumb[i]==x)
                    return v[j];
            }
        }
    }
    return -1;
}
int main ()
{
    fin>>n>>q;
    lg=sqrt (n);
    nrb=(n-1)/lg;
    for (i=0; i<nrb; i++)
    {
        fr[i][0]=lg;
        l[i]=lg*i;
        r[i]=lg*(i+1)-1;
        sumb[i]=0;
    }
    sumb[nrb]=0;
    fr[nrb][0]=n-lg*nrb;
    l[nrb]=lg*nrb;
    r[nrb]=n-1;
    for (i=1; i<n; i++)
    {
        fin>>x>>y;
        mch[x].push_back (y);
        mch[y].push_back (x);
    }
    dfs (1);
    for (i=0; i<k; i++)
        v[i]=v[i+1];
    k--;
    while (q--)
    {
        fin>>ch;
        if (ch==1)
        {
            fin>>nod>>val;
            update (poz[nod],poz[nod]+nr[nod]-1,val);
        }
        else
        {
            fin>>val;
            fout<<query (val)<<"\n";
        }
    }
    return 0;
}