Cod sursa(job #3191609)

Utilizator Emilia23Dobra Emilia Emilia23 Data 10 ianuarie 2024 09:56:29
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>
#define SIZE 100005

using namespace std;

ifstream f("arbore.in");
ofstream g("arbore.out");

int n,m,k,l,v[SIZE],sz[SIZE],poz[SIZE],add[SIZE],vv[SIZE];
vector<int>a[SIZE];
bitset<1000005>fv[320];

void dfs(int nod,int tata)
{
    v[++k]=nod;
    sz[nod]=1;
    poz[nod]=k;
    for(auto u:a[nod])
        if(u!=tata)
    {
        dfs(u,nod);
        sz[nod]+=sz[u];
    }
}

void update(int x,int y)
{
    int xx=x;
    x=poz[x];
    int i,st=(x-1)/l+1,dr=(x+sz[xx]-2)/l+1;
    for(i=st+1;i<=dr-1;i++)
        add[i]+=y;
    if(st==dr)
    {
        for(i=x;i<=x+sz[xx]-1;i++)
        {
            vv[v[i]]+=y;
            fv[st][vv[v[i]]]=1;
        }
    }
    else
    {
        for(i=x;i<=st*l;i++)
        {
            vv[v[i]]+=y;
            fv[st][vv[v[i]]]=1;
        }
        for(i=(dr-1)*l+1;i<=x+sz[xx]-1;i++)
        {
            vv[v[i]]+=y;
            fv[dr][vv[v[i]]]=1;
        }
    }
}

int query(int x)
{
    int i,j;
   for(i=1;i<=n/l;i++)
        if(x>=add[i] && fv[i][x-add[i]])
    {
        for(j=(i-1)*l+1;j<=i*l;j++)
            if(vv[v[j]]+add[i]==x)return v[j];
    }
    for(i=n-(n%l)+1;i<=n;i++)
        if(vv[v[i]]==x)return v[i];
    return -1;
}

int main()
{
    int i,p,q,x,y,c,s;
    f>>n>>m;
    for(i=1;i<n;i++)
    {
        f>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    //Liniarizam arborele
    dfs(1,0);
    l=sqrtl(n);
    for(i=1;i<=n/l;i++)
        fv[i][0]=1;
    for(i=1;i<=m;i++)
    {
        f>>c;
        if(c==1)
        {
            f>>p>>q;
            update(p,q);
        }
        else
        {
            f>>s;
            g<<query(s)<<'\n';
        }
    }
    return 0;
}