Cod sursa(job #2021657)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 14 septembrie 2017 10:58:12
Problema Arbore Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;

const int rp=500;

bitset<10*maxN> ap[rp+5];
vector<int> v[maxN];
int e[maxN],AD[rp+5];
bool seen[maxN];
int niv[maxN],h[maxN],dh,st[maxN],dr[maxN],vf,s[maxN];
inline void dfs(int nod)
{
    seen[nod]=1;
    h[++dh]=nod;
    st[nod]=dh;
    for(auto it:v[nod])
    {
        if(seen[it]) continue;
        niv[it]=1+niv[nod];
        dfs(it);
    }
}

inline void Build()
{
    for(int i=1;i<=dh;i++)
    {
        while(vf && niv[h[s[vf]]]>=niv[h[i]])
        {
            dr[h[s[vf]]]=i-1;
            vf--;
        }

        s[++vf]=i;
    }
    while(vf)
    {
        dr[h[s[vf]]]=dh;
        vf--;
    }
}
int op;
inline void Update(int nod,int val)
{
    int x,y,xbucket,ybucket;
    x=st[nod];
    y=dr[nod];
    xbucket=x/rp;
    if(x%rp) xbucket++;
    ybucket=y/rp;
    if(y%rp) ybucket++;
    if(xbucket<ybucket)
    {
        for(int bucket=xbucket+1;bucket<ybucket;bucket++)
            AD[bucket]+=val;
        for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
            ap[xbucket][e[i]]=0;
        for(int i=x;i<=xbucket*rp;i++)
            e[i]+=val;
        for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
            ap[xbucket][e[i]]=1;

        for(int i=(ybucket-1)*rp+1;i<=ybucket*rp;i++)
            ap[ybucket][e[i]]=0;
        for(int i=(ybucket-1)*rp+1;i<=y;i++)
            e[i]+=val;
        for(int i=(ybucket-1)*rp+1;i<=ybucket*rp;i++)
            ap[ybucket][e[i]]=1;
    }

        else
    {
        for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
            ap[xbucket][e[i]]=0;
        for(int i=x;i<=y;i++)
            e[i]+=val;
        for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
            ap[xbucket][e[i]]=1;
    }
}

inline void Search(int bucket,int val)
{
    for(int i=(bucket-1)*rp+1;i<=bucket*rp;i++)
        if(e[i]==val)
    {
        printf("%d\n",h[i]);
        return;
    }
}
inline void Query(int val)
{
    for(int i=1;i<=rp;i++)
        if(val>=AD[i] && ap[i][val-AD[i]])
    {
        Search(i,val-AD[i]);
        return;
    }
    printf("-1\n");
}

int n,q,x,y,p,add;
int main()
{
    freopen("arbore.in","r",stdin);
    freopen("arbore.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }

    niv[1]=1;
    dfs(1);

    Build();

    for(int i=1;i<=q;i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d%d",&p,&add);
            Update(p,add);
        }
            else
        {
            scanf("%d",&x);
            Query(x);
        }
    }
    return 0;
}