Cod sursa(job #1591326)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 6 februarie 2016 00:34:52
Problema Arbore Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#define sz 330
#define N 100005
#include <vector>
#include <bitset>

using namespace std;

int nr=0,i,q,n,op,x,y,Begin[N],End[N],a[N],ind[N],add[N],s,p;
vector<int> v[N];
bitset<N> bts[sz+2];
bool marked[N];

inline void DFS(int x)
{
     marked[x]=1;
     Begin[x]= ++nr;
     ind[nr]=x;

     int i;
     for(i=0;i<v[x].size();++i)
     if(!marked[v[x][i]])
     DFS(v[x][i]);

     End[x]=nr;
}

inline void UPDATE(int x,int y,int s)
{
    int i,bloc;
    bloc=x/sz+1;

    bts[bloc]=0;
    for(i=x;i<=bloc*sz && i<=y;++i) a[i]+=s;
    for(i=(bloc-1)*sz+1;i<=bloc*sz;++i) bts[bloc][a[i]]=1;

    if(bloc==y/sz+1) return;

    ++bloc;
    if(bloc+1!=y/sz+1) for(;bloc*sz<=y;++bloc) add[bloc]+=s;

    bts[bloc]=0;
    for(i=(bloc-1)*sz+1;i<=y;++i) a[i]+=s;
    for(i=(bloc-1)*sz+1;i<=bloc*sz;++i) bts[bloc][a[i]]=1;
}

inline void QUERY(int s)
{
    int bloc,i;
    for(bloc=1;bloc*sz<=n;++bloc)
    if(s>=add[bloc] && bts[bloc][s-add[bloc]])
    {
         for(i=(bloc-1)*sz+1;i<=bloc*sz;++i)
         if(a[i]+add[bloc]==s)
         {
              printf("%d\n",ind[i]);
              return;
         }
    }

    for(i=(bloc-1)*sz+1;i<=n;++i)
    if(a[i]+add[bloc]==s)
    {
        printf("%d\n",ind[i]);
        return;
    }
    printf("-1\n");
}
int main()
{
    freopen("arbore.in","r",stdin);
    freopen("arbore.out","w",stdout);

    scanf("%d%d",&n,&q);

    for(i=1;i<n;++i)
    {
         scanf("%d%d",&x,&y);
         v[x].push_back(y);
         v[y].push_back(x);
    }
    DFS(1);

    while(q--)
    {
        scanf("%d",&op);
        if(op==1)
        {
             scanf("%d%d",&p,&s);
             UPDATE(Begin[p],End[p],s);
        }
        else
        {
             scanf("%d",&s);
             QUERY(s);
        }
    }
    return 0;
}