Cod sursa(job #2009951)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 11 august 2017 12:46:40
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
const int rp=350;
multiset<int> Set[rp];
int vect[maxN],dv;
bool seen[maxN];
vector<int> v[maxN];
int depth[maxN];
inline void dfs(int nod)
{
    vect[++dv]=nod;
    seen[nod]=1;
    for(auto it:v[nod])
    {
        if(!seen[it])
        {
            depth[it]=1+depth[nod];
            dfs(it);
        }
    }
}
int val[maxN],n,m,x,y,nbucket;
inline void Search(int bucket,int y)
{
    int start,finish;
    start=rp*(bucket-1)+1;
    finish=rp*bucket;
    for(int i=start;i<=finish;i++)
        if(val[i]==y)
    {
        printf("%d\n",i);
        return ;
    }
}
int add[rp],pos[maxN],vf,st[maxN],op,p,dr[maxN],bucket,vl;
int main()
{
    freopen("arbore.in","r",stdin);
    freopen("arbore.out","w",stdout);
    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);
    }

    nbucket=n/rp;
    if(n%rp) nbucket++;
    dfs(1);
    for(int i=1;i<=dv;i++)
    {
        pos[vect[i]]=i;
        if(vf && depth[vect[st[vf]]]==depth[i])
        {
            dr[vect[st[vf]]]=i-1;
            vf--;
        }
        st[++vf]=i;
    }
    while(vf)
    {
        dr[vect[st[vf]]]=n;
        vf--;
    }
    for(int i=1;i<=n;i++)
    {
        bucket=i/rp;
        if(i%rp) bucket++;
        Set[bucket].insert(0);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
        scanf("%d%d",&x,&y);
        p=pos[x];
        int xbucket=p/rp;
        if(p%rp) xbucket++;
        int ybucket=dr[x]/rp;
        if(dr[x]%rp) ybucket++;
        for(int bucket=xbucket+1;bucket<ybucket;bucket++)
        {
            add[bucket]+=y;
        }
        if(xbucket==ybucket)
        {
            for(int j=p;j<=dr[x];j++)
            {
                multiset<int>::iterator it=Set[xbucket].lower_bound(val[j]);
                Set[xbucket].erase(it);
                Set[xbucket].insert(val[j]+y);
                val[j]+=y;
            }
            continue;
        }
        for(int j=p;j<=rp*xbucket;j++)
        {
            multiset<int>::iterator it=Set[xbucket].lower_bound(val[j]);
            Set[xbucket].erase(it);
            Set[xbucket].insert(val[j]+y);
            val[j]+=y;
        }

        for(int j=rp*(ybucket-1)+1;j<=dr[x];j++)
        {
            multiset<int>::iterator it=Set[ybucket].lower_bound(val[j]);
            Set[ybucket].erase(it);
            Set[ybucket].insert(val[j]+y);
            val[j]+=y;
        }


        }
            else
        if(op==2)
        {
            scanf("%d",&vl);
            for(int i=1;i<=nbucket;i++)
            {
                int y=vl-add[i];
                multiset<int>::iterator it=Set[i].lower_bound(y);
                if(it!=Set[i].end() && *it==y)
                {
                    Search(i,y);
                    break;
                }
            }
        }
    }
    return 0;
}