Cod sursa(job #2002244)

Utilizator refugiatBoni Daniel Stefan refugiat Data 19 iulie 2017 09:51:17
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>
#define NMAX 1000005
#define XMAX 100005
using namespace std;
int nr,k,add[NMAX],abuc[NMAX];
int buc[XMAX],ap[XMAX],vect[XMAX];
int inc[XMAX],fin[XMAX],stv[XMAX],drv[XMAX];
bitset<NMAX> b[320];
vector<int> v[XMAX];
ifstream si("arbore.in");
ofstream so("arbore.out");
void dfs(int nod)
{
    ap[nod]=1;
    nr++;
    vect[nr]=nod;
    inc[nod]=nr;
    for(int i=0;i<v[nod].size();i++)
        if(ap[v[nod][i]]==0)dfs(v[nod][i]);
    fin[nod]=nr;
}
void ubuc(int buc,int val)
{
    for(int i=stv[buc];i<=drv[buc];i++)
        b[buc][add[i]]=val;
}
void upd(int st,int dr,int val)
{
    if(buc[st]==buc[dr])
    {
        ubuc(buc[st],0);
        for(int i=st;i<=dr;i++)
            add[i]+=val;
        ubuc(buc[st],1);
    }
    else
    {
        ubuc(buc[st],0);
        ubuc(buc[dr],0);
        for(int i=st;i<=drv[buc[st]];i++)
            add[i]+=val;
        for(int i=stv[buc[dr]];i<=dr;i++)
            add[i]+=val;
        ubuc(buc[st],1);
        ubuc(buc[dr],1);
        for(int i=buc[st]+1;i<=buc[dr]-1;i++)
            abuc[i]+=val;
    }
}
int query(int s)
{
    int i,j;
    for(int i=1;i<=k;i++)
    {
        if(s-abuc[i]>=0&&b[i][s-abuc[i]]==1)
        {
            for(int j=stv[i];j<=drv[i];j++)
                if(add[j]+abuc[i]==s)return vect[j];
        }
    }
    return -1;
}
int main()
{
    int n,m;
    si>>n>>m;
    int x,y;
    for(int i=1;i<n;i++)
    {
        si>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1);
    for(int i=1;i*i<=n;i++)
        k=i;
    nr=0;
    for(int i=1;(i-1)*k+1<=n;i++)
    {
        nr++;
        stv[i]=(i-1)*k+1;
        for(int j=stv[i];j<=stv[i]+k-1&&j<=n;j++)
        {
            drv[i]=j;
            buc[j]=i;
        }
    }
    stv[0]=0;
    k=nr;
    for(int i=1;i<=k;i++)
        b[i][0]=1;
    int q;
    for(int i=1;i<=m;i++)
    {
        si>>q;
        if(q==1)
        {
            si>>x>>y;
            upd(inc[x],fin[x],y);
        }
        else
        {
            si>>x;
            so<<query(x)<<'\n';
        }
    }
    return 0;
}