Pagini recente » Cod sursa (job #403277) | Cod sursa (job #2133554) | Cod sursa (job #2534173) | Cod sursa (job #699395) | Cod sursa (job #3230450)
// Ilie "The-Winner" Dumitru
#include<cstdio>
#include<set>
#include<map>
#include<vector>
const int NMAX = 100005, BLKSZ = 300;
int N;
std::vector<int> G[NMAX];
int first[NMAX], last[NMAX], curr;
int who[NMAX];
void dfs(int node, int tt = -1)
{
int i;
who[curr] = node;
first[node] = curr++;
for(i = 0;i < (int)G[node].size();++i)
if(G[node][i] != tt)
dfs(G[node][i], node);
last[node] = curr;
}
int v[NMAX];
std::map<int, std::set<int> > blockSet[NMAX / BLKSZ + 5];
int blockAdd[NMAX / BLKSZ + 5];
int blockId(int i)
{
return i / BLKSZ;
}
void add(int node, int sum)
{
int start = first[node], end = last[node] - 1;
int startId = blockId(start), endId = blockId(end);
int i;
std::set<int>::iterator it;
if(startId == endId)
{
for(i = start;i <= end;++i)
{
std::set<int>& s = blockSet[startId][v[i]];
it = s.find(i);
if(it != s.end())
s.erase(it);
v[i] += sum;
blockSet[startId][v[i]].insert(i);
}
}
else
{
for(i = start;blockId(i) == startId;++i)
{
std::set<int>& s = blockSet[startId][v[i]];
it = s.find(i);
if(it != s.end())
s.erase(it);
v[i] += sum;
blockSet[startId][v[i]].insert(i);
}
for(i = end;blockId(i) == endId;--i)
{
std::set<int>& s = blockSet[endId][v[i]];
it = s.find(i);
if(it != s.end())
s.erase(it);
v[i] += sum;
blockSet[endId][v[i]].insert(i);
}
for(i = startId + 1;i < endId;++i)
blockAdd[i] += sum;
}
}
int find(int sum)
{
int i, blk;
std::multiset<int>::iterator it;
for(blk = i = 0;i < N;i += BLKSZ, ++blk)
{
if(sum - blockAdd[blk] > -1)
{
std::set<int>& s = blockSet[blk][sum - blockAdd[blk]];
if(!s.empty())
return *s.begin() + 1;
}
}
return -1;
}
int main()
{
FILE* f = fopen("arbore.in", "r"), *g = fopen("arbore.out", "w");
// FILE* f = stdin, *g = stdout;
int _, i, a, b, op, node, sum;
fscanf(f, "%d%d", &N, &_);
for(i = 1;i < N;++i)
{
fscanf(f, "%d%d", &a, &b);
G[--a].push_back(--b);
G[b].push_back(a);
}
dfs(0);
do
{
fscanf(f, "%d", &op);
if(op == 1)
{
fscanf(f, "%d%d", &node, &sum);
add(node - 1, sum);
}
else
{
fscanf(f, "%d", &sum);
fprintf(g, "%d\n", find(sum));
}
}while(--_);
fclose(f);
fclose(g);
return 0;
}