Cod sursa(job #1956582)

Utilizator andreeainfo_dAndreea Dutulescu andreeainfo_d Data 6 aprilie 2017 20:57:46
Problema Arbore Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>
using namespace std;
int nr,k,add[100005],adbuc[100005],bucata[100005],ap[100005],vect[100005],inc[100005],fin[100005],st[100005],dr[100005],i,n,nrt,q,x,y;
bitset <100005> biti[320];
vector <int> v[100005];
void dfs(int nod)
{
    int i;
    ap[nod]=1;
    nr++;
    vect[nr]=nod;
    inc[nod]=nr;
    for(i=0;i<v[nod].size();i++)
        if(ap[v[nod][i]]==0)dfs(v[nod][i]);
    fin[nod]=nr;
}
void update_bucata(int bucata, int val)
{
    int i;
    for(i=(bucata-1)*k+1;i<=bucata*k;i++)
        biti[bucata][add[i]]=val;
}
void update(int st, int dr, int val)
{
    int i;
    if(bucata[st]==bucata[dr])
    {
        update_bucata(bucata[st],0);
        for(i=st;i<=dr;i++)
            add[i]+=val;
        update_bucata(bucata[st],1);
    }
    else
    {
        update_bucata(bucata[st],0);
        update_bucata(bucata[dr],0);
        for(i=st;i<=bucata[st]*k;i++)
            add[i]+=val;
        for(i=(bucata[dr]-1)*k+1;i<=dr;i++)
            add[i]+=val;
        update_bucata(bucata[st],1);
        update_bucata(bucata[dr],1);
        for(i=bucata[st]+1;i<=bucata[dr]-1;i++)
            adbuc[i]+=val;
    }
}
int query(int s)
{
    int i,j;
    for(i=1;i<=k;i++)
    {
        if(s-adbuc[i]>=0&&biti[i][s-adbuc[i]]==1)
        {
            for(j=(i-1)*k+1;j<=i*k;j++)
                if(add[j]+adbuc[i]==s)return vect[j];
        }
    }
    return -1;
}
int main()
{
    freopen("arbore.in","r",stdin);
    freopen("arbore.out","w",stdout);
    scanf("%d%d",&n,&nrt);
    for(i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1);
    for(i=1;i*i<=nr;i++)
        k=i;
    k++;
    for(i=nr+1;i<=k*k;i++)
        vect[i]=-1000;
    for(i=1;i<=k*k;i++)
    {
        bucata[i]=(i-1)/k+1;
    }
    for(i=1;i<=k;i++)
    {
        st[i]=k*(i-1)+1-k;
        dr[i]=k*(i-1)+1+k;
    }
    for(i=1;i<=k;i++)
        biti[i][0]=1;
    for(i=1;i<=nrt;i++)
    {
        scanf("%d",&q);
        if(q==1)
        {
            scanf("%d%d",&x,&y);
            update(inc[x],fin[x],y);
        }
        else
        {
            scanf("%d",&x);
            printf("%d\n",query(x));
        }
    }
    return 0;
}