Pagini recente » Cod sursa (job #2002949) | Cod sursa (job #1890045) | Cod sursa (job #1913447) | Monitorul de evaluare | Cod sursa (job #944738)
Cod sursa(job #944738)
#include <fstream>
#include <tr1/unordered_map>
#include <vector>
using namespace std;
int N, Q;
vector<int> V[100002];
bool S[100002];
tr1::unordered_map<int, int> M[350];
int in[100002], out[100002];
int nod[100002], val[100002], add[350];
int bucket;
void Dfs(int x)
{
S[x] = true;
nod[++nod[0]] = x;
in[x] = nod[0];
for (vector<int>::iterator it = V[x].begin(); it != V[x].end(); ++it)
if (!S[*it])
Dfs(*it);
out[x] = nod[0];
}
int main()
{
ifstream fin("arbore.in");
ofstream fout("arbore.out");
fin >> N >> Q;
for (int i = 1, nod1, nod2; i <= N - 1; ++i)
{
fin >> nod1 >> nod2;
V[nod1].push_back(nod2);
V[nod2].push_back(nod1);
}
Dfs(1);
for (; bucket * bucket < N; ++bucket);
for (int i = 1, b = 1; bucket * i <= N; i += bucket, ++b)
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
M[b][0] = nod[j];
for (int i = 1, type, valn, nodn; i <= Q; ++i)
{
fin >> type;
if (type == 1)
{
fin >> nodn >> valn;
int pos1 = in[nodn], pos2 = out[nodn];
for (int i = 1, b = 1; bucket * i <= N; i += bucket, ++b)
{
if (pos1 >= i && pos1 < i + bucket && pos2 >= i + bucket)
{
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
val[j] += add[b];
M[b].clear();
add[b] = 0;
for (int j = pos1; j <= N && j <= i + bucket - 1; ++j)
val[j] += valn;
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
M[b][val[j]] = nod[j];
}
else if (pos1 >= i && pos2 < i + bucket)
{
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
val[j] += add[b];
M[b].clear();
add[b] = 0;
for (int j = pos1; j <= N && j <= pos2; ++j)
val[j] += valn;
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
M[b][val[j]] = nod[j];
}
else if (pos2 >= i && pos2 < i + bucket)
{
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
val[j] += add[b];
M[b].clear();
add[b] = 0;
for (int j = i; j <= N && j <= pos2; ++j)
val[j] += valn;
for (int j = i; j <= N && j <= i + bucket - 1; ++j)
M[b][val[j]] = nod[j];
}
else if (pos1 <= i && pos2 >= i + bucket)
add[b] += valn;
}
}
else
{
fin >> valn;
bool found = false;
for (int i = 1, b = 1; bucket * i <= N; i += bucket, ++b)
if (M[b].find(valn - add[b]) != M[b].end())
{
found = true;
fout << M[b][valn - add[b]] << '\n';
break;
}
if (!found) fout << -1 << '\n';
}
}
fin.close();
fout.close();
}