Pagini recente » Cod sursa (job #3167221) | Cod sursa (job #2167386) | Cod sursa (job #795686) | Cod sursa (job #2887893) | Cod sursa (job #3231414)
#include <fstream>
#include <unordered_map>
#include <cmath>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin ("arbore.in");
ofstream fout ("arbore.out");
int n,q,nod,k,b1,b2,i,j,lg,x,y,ch,nrb,val;
int v[100001],s[100001],poz[100001],nr[100001],sumb[318],l[318],r[318];
unordered_map <int,int> fr[318];
vector <int> mch[100001];
bitset <100001> viz;
void dfs (int nod)
{
viz[nod]=1;
v[k]=nod;
poz[nod]=k;
k++;
nr[nod]=1;
for (int i=0; i<mch[nod].size (); i++)
{
int vecin=mch[nod][i];
if (!viz[vecin])
{
dfs (vecin);
nr[nod]+=nr[vecin];
}
}
}
void update (int st,int dr,int val)
{
b1=st/lg;
b2=dr/lg;
if (b1!=b2)
{
for (i=st; i<=r[b1]; i++)
{
fr[b1][s[i]+sumb[b1]]--;
if (fr[b1][s[i]+sumb[b1]]==0)
fr[b1].erase (fr[b1].find (s[i]+sumb[b1]));
s[i]+=val;
fr[b1][s[i]+sumb[b1]]++;
}
for (i=l[b2]; i<=dr; i++)
{
fr[b2][s[i]+sumb[b2]]--;
if (fr[b2][s[i]+sumb[b2]]==0)
fr[b2].erase (fr[b2].find (s[i]+sumb[b2]));
s[i]+=val;
fr[b2][s[i]+sumb[b2]]++;
}
for (i=b1+1; i<b2; i++)
sumb[i]+=val;
}
else
{
for (i=st; i<=dr; i++)
{
fr[b1][s[i]+sumb[b1]]--;
if (fr[b1][s[i]+sumb[b1]]==0)
fr[b1].erase (fr[b1].find (s[i]+sumb[b1]));
s[i]+=val;
fr[b1][s[i]+sumb[b1]]++;
}
}
}
int query (int x)
{
for (i=0; i<=nrb; i++)
{
if (fr[i].find (x-sumb[i])!=fr[i].end ()&&fr[i][x-sumb[i]]>0)
{
for (j=l[i]; j<=r[i]; j++)
{
if (s[j]+sumb[i]==x)
return v[j];
}
}
}
return -1;
}
int main ()
{
fin>>n>>q;
lg=sqrt (n);
nrb=(n-1)/lg;
for (i=0; i<nrb; i++)
{
fr[i][0]=lg;
l[i]=lg*i;
r[i]=lg*(i+1)-1;
sumb[i]=0;
}
sumb[nrb]=0;
fr[nrb][0]=n-lg*nrb;
l[nrb]=lg*nrb;
r[nrb]=n-1;
for (i=1; i<n; i++)
{
fin>>x>>y;
mch[x].push_back (y);
mch[y].push_back (x);
}
dfs (1);
k--;
while (q--)
{
fin>>ch;
if (ch==1)
{
fin>>nod>>val;
update (poz[nod],poz[nod]+nr[nod]-1,val);
}
else
{
fin>>val;
fout<<query (val)<<"\n";
}
}
return 0;
}