Cod sursa(job #2399677)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 7 aprilie 2019 20:56:33
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<fstream>
#include<vector>
#include<cmath>
#define DIN 100000
#define DIM 200000
#define DIMQ 450
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
vector<int> v[DIN];
int l[DIM],st[DIMQ],dr[DIMQ],pp[DIM],e[DIN],b[DIN],ad[DIMQ][DIMQ],f[DIMQ][10000],valu[DIMQ];
int n,k,q,i,a,bb,lim,poz,loc,t,nod,c,en,start,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);
    l[++k]=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++;ad[loc][poz]=0;f[loc][ad[loc][poz]]++;
        if(poz==lim){dr[loc]=i;loc++;poz=0;}
    }
    for(;q--;)
    {
        fin>>t;
        if(t==1)
        {
            fin>>nod>>c;
            start=b[nod];en=e[nod];
            for(i=start;i<=en;i++)
            {
                if(st[pp[i]]>=start&&dr[pp[i]]<=en) valu[pp[i]]+=c,i=dr[pp[i]];
                else
                {
                    f[pp[i]][ad[pp[i]][i-st[pp[i]]+1]]--;
                    ad[pp[i]][i-st[pp[i]]+1]+=c;
                    f[pp[i]][ad[pp[i]][i-st[pp[i]]+1]]++;
                }
            }
        }
        else
        {
            fin>>c;ok=1;
            for(i=pp[1];i<=pp[n]&&ok;i++)
            {
                if(f[i][c-valu[i]])
                    for(j=1;j<=lim;j++)
                        if(ad[i][j]+valu[i]==c)
                        {
                            fout<<l[j+st[i]-1]<<"\n";
                            ok=0;
                            break;
                        }
            }
            if(ok==1) fout<<"-1\n";
        }
    }
    return 0;
}