Cod sursa(job #1329731)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 29 ianuarie 2015 20:03:53
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cassert>
#include <bitset>

#define NMAX 100000
#define RADMAX 405
using namespace std;

int n;
vector<int> graf[NMAX+5];

int poz;
int parc[NMAX+5];
int first[NMAX+5];
int last[NMAX+5];

void dfs (int nod, int father) {
    parc[++poz]=nod;
    first[nod]=poz;
    for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++)
        if(*it!=father)
            dfs(*it,nod);
    last[nod]=poz;
}

int rad;
int lazy[RADMAX];

int sir[NMAX+5];

bitset<1000005> _hashes[RADMAX];

inline void de_hash (int bucata) {
    int aux=min(n,bucata*rad);
    for(int i=(bucata-1)*rad+1;i<=aux;i++)
        _hashes[bucata][sir[i]]=0;
}

inline void _hash (int bucata) {
    int aux=min(n,bucata*rad);
    for(int i=(bucata-1)*rad+1;i<=aux;i++)
        _hashes[bucata][sir[i]]=1;
}

void update (int st, int dr, int val) {
    int bst=(st-1)/rad+1;
    int bdr=(dr-1)/rad+1;

    if(bst==bdr) {
        de_hash(bst);
        for(int i=st;i<=dr;i++)
            sir[i]+=val;
        _hash(bst);
    }
    else {
        for(int i=bst+1;i<bdr;i++)
            lazy[i]+=val;

        de_hash(bst);de_hash(bdr);

        int bstrad=min(n,bst*rad);
        for(int i=st;i<=bstrad;i++)
            sir[i]+=val;

        for(int i=(bdr-1)*rad+1;i<=dr;i++)
            sir[i]+=val;
        _hash(bst),_hash(bdr);
    }
}

inline int query (int sum) {
    int j,aux=(n-1)/rad+1;
    for(int i=1;i<=aux;i++)
        if(sum>=lazy[i] && _hashes[i][sum-lazy[i]])
            for(j=(i-1)*rad+1,aux=min(i*rad,n),sum-=lazy[i];j<=aux;j++)
                if(sir[j]==sum)
                    return parc[j];
    return -1;
}

int main()
{
    ifstream cin("arbore.in");
    ofstream cout("arbore.out");

    int m=0;
    cin>>n>>m;

    rad=min((int)(1*sqrt(n)),n);
    //cout<<"rad="<<rad<<endl;

    int a,b;
    for(int i=1;i<n;i++) {
        cin>>a>>b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }

    dfs(1,0);

    int aux=(n-1)/rad+1;
    for(int i=1;i<=aux;i++)
        _hashes[i][0]=1;

    int tip,p,s;
    while(m--) {
        cin>>tip;

        if(tip==1) {
            cin>>p>>s;

            //cout<<first[p]<<' '<<last[p]<<endl;
            update(first[p],last[p],s);
        }
        else {
            cin>>s;
            cout<<query(s)<<'\n';
        }
    }

    cin.close();
    cout.close();
    return 0;
}