Cod sursa(job #2246139)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 26 septembrie 2018 18:34:00
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;

const int rad=316;

struct bucket
{
    int s;
    bitset<1000001> vaz;
}buk[rad+10];

int first[100010],euler[100010],last[100010],l,nrbuk[100010],val[100010];
vector<int> v[100010];

void dfs(int nod,int tata)
{
    euler[++l]=nod;
    first[nod]=l;
    for(int i=0;i<v[nod].size();i++)
        if(v[nod][i]!=tata) dfs(v[nod][i],nod);
    last[nod]=l;
}

void update(int poz,int st,int dr,int s)
{
    int l1=(poz-1)*rad+1,r1=min(poz*rad,l);
    for(int i=l1;i<=r1;i++) buk[poz].vaz[val[i]]=0;
    for(int i=st;i<=dr;i++) val[i]+=s;
    for(int i=l1;i<=r1;i++) buk[poz].vaz[val[i]]=1;
}

int main()
{
    freopen("arbore.in","r",stdin);
    freopen("arbore.out","w",stdout);
    int n,m,x,y,tip;
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1,0);
    int nrb=0;
    for(int i=1;i<=l;i++)
    {
        if((i-1)%rad==0) nrb++;
        nrbuk[i]=nrb;
        buk[nrb].vaz[0]=1;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&tip);
        if(tip==1)
        {
            scanf("%d%d",&x,&y);
            int a=nrbuk[first[x]],b=nrbuk[last[x]];
            for(int j=a+1;j<b;j++) buk[j].s+=y;
            if(a==b) update(a,first[x],last[x],y);
            else
            {
                update(a,first[x],a*rad,y);
                update(b,(b-1)*rad+1,last[x],y);
            }
        }
        else
        {
            scanf("%d",&x);
            int sol=-1;
            for(int i=1;i<=nrb;i++)
                if(x-buk[i].s>=0 && buk[i].vaz[x-buk[i].s]==1)
                {
                    int l1=(i-1)*rad+1,r1=min(i*rad,l);
                    for(int j=l1;j<=r1;j++)
                        if(val[j]==x-buk[i].s) {sol=euler[j];break;}
                    break;
                }
            printf("%d\n",sol);
        }
    }
    return 0;
}