Cod sursa(job #1264426)

Utilizator Kira96Denis Mita Kira96 Data 15 noiembrie 2014 19:59:58
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include<fstream>
#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#define FIT(a,b) for(vector<int>::iterator a=b.begin();a!=b.end();a++)
#include<stack>
#define ROF(a,b,c) for(int a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define REP(a,b) for(register int a=0;a<b;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<queue>
#define debug cerr<<"OK";
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define mod 31333
#define N 100100
#define M 1000100
#define SQ 350
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");
/*int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};*/
bitset<M>ok[SQ];
vector<int> v[N];
int old[N],lef[N],tip,sum,rig[N],nou[N],t,n,m,x,ls,ld,sqr,dru,nrb,y,buc[SQ],s[N];
void dfs(int x)
{
    nou[x]=++t;
    old[t]=x;
    lef[t]=t;
    FIT(it,v[x])
    if(!nou[*it])
        dfs(*it);
    rig[nou[x]]=t;
}
void futel(int buc,int &poz,int val,int dr)
{
    ls=(buc-1)*sqr+1;
    ld=min(buc*sqr,n);
    dru=min(dr,ld);
    FOR(i,poz,dru)
    ok[buc][s[i]]=0;
    FOR(i,poz,dru)
    s[i]+=val;
    FOR(i,ls,ld)
    ok[buc][s[i]]=1;
    poz=dru+1;
}
void upd(int st,int dr,int val)
{
    if((st-1)%sqr)
        futel((st-1)/sqr+1,st,val,dr);
    while(st+sqr-1<=dr)
    {
        buc[(st-1)/sqr+1]+=val;
        st+=sqr;
    }
    if(st<=dr)
        futel((st-1)/sqr+1,st,val,dr);
}
int query(int sum)
{
    FOR(i,1,nrb)
    if(buc[i]<=sum)
        if(ok[i][sum-buc[i]])
            FOR(j,(i-1)*sqr+1,min(i*sqr,n))
            if(s[j]==sum-buc[i])
            return old[j];
    return -1;
}
int main ()
{
    f>>n>>m;
    FOR(i,1,n-1)
    {
        f>>x>>y;
        v[x].pb(y);
        v[y].pb(x);
    }
    dfs(1);
    sqr=(int)sqrt(n);
    nrb=n/sqr;
    if(n%sqr)
        nrb++;
    FOR(i,1,nrb)
    {
        ok[i][0]=1;
    }
    FOR(i,1,m)
    {
        f>>tip;
        --tip;
        if(!tip)
        {
            f>>x>>y;
            x=nou[x];
            upd(lef[x],rig[x],y);
        }
        else
        {
            f>>sum;
            g<<query(sum)<<"\n";
        }
    }
    return 0;
}
//Look at me! Look at me! The monster inside me has grown this big!