Cod sursa(job #940998)

Utilizator stefanzzzStefan Popa stefanzzz Data 17 aprilie 2013 18:25:13
Problema Arbore Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.72 kb
#include <fstream>
#include <vector>
#include <math.h>
#include <bitset>
#define MAXN 100005
#define MAXSQRTN 320
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");

int n,m,x,y,s,norm[MAXN],cnt,subarb[MAXN],tata[MAXN],tip,a[MAXN],b[MAXSQRTN],sq,normi[MAXN];
vector<int> G[MAXN];
bitset<10*MAXN> v[MAXSQRTN];

void DFS(int p);
void update(int p,int q);
int solve();

int main()
{
    int i;
    f>>n>>m;
    sq=((int)(sqrt((double)n)));
    for(i=1;i<n;i++){
        f>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);}
    DFS(1);
    for(i=1;i<=(n-1)/sq+1;i++)
        v[i][0]=1;
    for(i=1;i<=m;i++){
        f>>tip;
        if(tip==1){
            f>>x>>s;
            update(norm[x],subarb[x]);}
        else{
            f>>s;
            g<<solve()<<'\n';}}
    f.close();
    g.close();
    return 0;
}

void DFS(int p){
    int i;
    norm[p]=(++cnt);
    normi[cnt]=p;
    for(i=0;i<G[p].size();i++){
        x=G[p][i];
        if(x!=tata[p]){
            tata[x]=p;
            DFS(x);}}
    subarb[p]=cnt;}

void update(int p,int q){
    int i;
    x=(p-1)/sq+1;
    y=(q-1)/sq+1;
    for(p;p<=q&&(p%sq)!=1;p++){
        v[x][a[p]]=0;
        a[p]+=s;}
    for(q;q>=p&&(q%sq);q--){
        v[y][a[q]]=0;
        a[q]+=s;}
    for(i=(x-1)*sq+1;i<=x*sq;i++)
        v[x][a[i]]=1;
    for(i=(y-1)*sq+1;i<=y*sq;i++)
        v[y][a[i]]=1;
    if(p>q)
        return;
    p=p/sq+1;
    q/=sq;
    for(p;p<=q;p++)
        b[p]+=s;}

int solve(){
    int i,j;
    for(i=1;i<=(n-1)/sq+1;i++)
        if((s-b[i]>=0)&&v[i][s-b[i]]){
            s-=b[i];
            for(j=(i-1)*sq+1;a[j]!=s;j++);
            return normi[j];}
    return -1;}