Cod sursa(job #1448058)

Utilizator george_stelianChichirim George george_stelian Data 5 iunie 2015 23:52:52
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <cmath>

using namespace std;

struct strbucket
{
    int st,dr,s;
    bitset<1000010> vaz;
}v1[320];
vector<int> v[100010];
int val[100010],q[100010],first[100010],last[100010],nr,rad;
char vaz[100010];

int bucket(int x)
{
    return (x-1)/rad+1;
}

void dfs(int nod)
{
    vaz[nod]=1;
    q[++nr]=nod;
    first[nod]=nr;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
        if(!vaz[*it]) dfs(*it);
    last[nod]=nr;
}

void update(int buc,int st,int dr,int s)
{
    for(int i=v1[buc].st;i<=v1[buc].dr;i++) v1[buc].vaz[val[i]]=0;
    for(int i=st;i<=dr;i++) val[i]+=s;
    for(int i=v1[buc].st;i<=v1[buc].dr;i++) v1[buc].vaz[val[i]]=1;
}

int main()
{
    freopen("arbore.in", "r", stdin);
    freopen("arbore.out", "w", stdout);
    int n,m,tip,x,y,nrbuc,nod,s;
    scanf("%d%d",&n,&m);
    rad=sqrt(n)+1;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1);
    for(int i=1;rad*(i-1)<nr;i++)
    {
        v1[i].st=rad*(i-1)+1;
        v1[i].dr=min(nr,rad*i);
        v1[i].vaz[0]=1;
        nrbuc=i;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&tip);
        if(tip==1)
        {
            scanf("%d%d",&nod,&s);
            int lim=bucket(last[nod]);
            for(int j=bucket(first[nod]);j<=lim;j++)
                if(first[nod]<=v1[j].st && v1[j].dr<=last[nod]) v1[j].s+=s;
                else update(j,max(first[nod],v1[j].st),min(last[nod],v1[j].dr),s);
        }
        else
        {
            int sol=-1,s;
            scanf("%d",&s);
            for(int j=1;j<=nrbuc;j++)
                if(s-v1[j].s>=0 && v1[j].vaz[s-v1[j].s]==1)
                {
                    for(int q=v1[j].st;q<=v1[j].dr;q++) if(val[q]==s-v1[j].s) {sol=q;break;}
                    break;
                }
            printf("%d\n",sol);
        }
    }
    return 0;
}