Cod sursa(job #2399735)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 7 aprilie 2019 22:32:53
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<bitset>
#define DIM 100010
#define DIMQ 330
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
vector<int> v[DIM];
int l[DIM],aux,st[DIMQ],dr[DIMQ],pp[DIM],e[DIM],b[DIM],ad[DIM],va[DIMQ];
bitset<1000101> f[DIMQ];
int n,k,q,i,a,bb,lim,poz,loc,t,nod,c,en,in,ok,j;
void dfs(int nod, int tata)
{
    l[++k]=nod;b[nod]=k;
    for(auto it:v[nod])
        if(it!=tata) dfs(it,nod);
    e[nod]=k;
}
int main()
{
    fin>>n>>q;
    for(i=1;i<n;i++)
    {
        fin>>a>>bb;
        v[a].push_back(bb);v[bb].push_back(a);
    }dfs(1,0);
    lim=sqrt(k);poz=0;loc=1;
    for(i=1;i<=k;i++)
    {
        if(poz==0) st[loc]=i;pp[i]=loc;
        poz++;if(poz==lim){dr[loc]=i;loc++;poz=0;}
    }
    if(dr[loc]==0) dr[loc]=k;
    for(;q--;)
    {
        fin>>t;
        if(t==1)
        {
            fin>>nod>>c;
            in=b[nod];en=e[nod];
            for(i=st[pp[in]];i<=dr[pp[in]];i++) f[pp[in]][ad[i]]=0;
            for(i=in;i<=en&&i<=dr[pp[in]];i++) ad[i]+=c;
            for(i=st[pp[in]];i<=dr[pp[in]];i++) f[pp[in]][ad[i]]=1;
            if(pp[in]==pp[en]) continue;
            aux=pp[in]+1;while(aux<pp[en]) va[aux++]+=c;
            for(i=st[pp[en]];i<=dr[pp[en]];i++) f[pp[en]][ad[i]]=0;
            for(i=st[pp[en]];i<=en;i++) ad[i]+=c;
            for(i=st[pp[en]];i<=dr[pp[en]];i++) f[pp[en]][ad[i]]=1;
        }
        else
        {
            fin>>c;ok=1;
            for(i=pp[1];i<=pp[k]&&ok;i++)
            {
                if(va[i]<=c&&f[i][c-va[i]])
                    for(j=st[i];j<=dr[i];j++)
                        if(ad[j]+va[i]==c)
                        {
                            fout<<l[j]<<"\n";
                            ok=0;break;
                        }
            }
            if(ok==1) fout<<"-1\n";
        }
    }
    return 0;
}