Pagini recente » Cod sursa (job #100093) | Cod sursa (job #1960385) | Cod sursa (job #2554346) | Cod sursa (job #2767011) | Cod sursa (job #348777)
Cod sursa(job #348777)
#include <cstdio>
#include <vector>
#include <math.h>
using namespace std;
#define Nmax 100010
int n, m, x, y, i, tip, p, s, rad, l, strad, drrad;
int viz[Nmax], nr[Nmax], poz[Nmax], v[Nmax], a[Nmax], b[350], da[400], P[350][34000];
char da2[1000010];
vector <int> V[Nmax];
void DFS (int nod) {
v[++v[0]] = nod; poz[nod] = v[0]; viz[nod] = 1; nr[nod] = 1;
int i;
for (i = 0; i < (int)V[nod].size(); i++)
if ( !viz[ V[nod][i] ] ) {
DFS (V[nod][i]);
nr[nod]+= nr[ V[nod][i] ];
}
}
void update (int p, int s) {
int irad, st = poz[p], dr = st + nr[p] - 1, NR = rad, i;
for (irad = 1; st > NR ; irad++, NR+= rad);
strad = irad;
for (irad = irad, NR = irad * rad; dr > NR ; irad++, NR+= rad);
drrad = irad;
if (strad == drrad) {
da[0] = 0;
for (i = (strad - 1)*rad + 1 ; i < st; i++) {
da[++da[0]] = a[i];
da2[a[i]] = 1;
}
l = strad * rad;
for (i = dr + 1 ; i <= l && i <= n ; i++) {
da[++da[0]] = a[i];
da2[a[i]] = 1;
}
for (i = st; i <= dr; i++){
if ( !da2[ a[i] ] ) P[strad][ a[i] / 30 ]^= (1 << (a[i] % 30) );
a[i]+= s;
//P[strad][a[i]] = 1;
P[strad][ a[i] / 30 ]|= (1 << (a[i] % 30) );
}
for (i = 1; i <= da[0]; i++)
da2[ da[i] ] = 0;
}
else {
da[0] = 0;
for (i = (strad - 1)*rad + 1 ; i < st; i++) {
da[++da[0]] = a[i];
da2[a[i]] = 1;
}
l = strad * rad;
for (i = st; i <= l; i++) {
if ( !da2[ a[i] ] ) P[strad][ a[i] / 30 ]^= (1 << (a[i] % 30) );
a[i]+= s;
P[strad][ a[i] / 30 ]|= (1 << (a[i] % 30) );
}
for (i = 1; i <= da[0]; i++)
da2[ da[i] ] = 0;
for (irad = strad + 1; irad <= drrad - 1; irad++)
b[irad]+= s;
da[0] = 0;
l = strad * rad;
for (i = dr + 1 ; i <= l && i <= n ; i++) {
da[++da[0]] = a[i];
da2[a[i]] = 1;
}
l = (drrad - 1) * rad + 1;
for (i = l; i <= dr; i++) {
if ( !da2[ a[i] ] ) P[drrad][ a[i] / 30 ]^= (1 << (a[i] % 30) );
a[i]+= s;
P[drrad][ a[i] / 30 ]|= (1 << (a[i] % 30) );
}
for (i = 1; i <= da[0]; i++)
da2[ da[i] ] = 0;
}
}
int query (int s) {
int irad, i;
for (irad = 1; irad <= rad + 1; irad++)
//if ( s - b[irad] > 0 && P[irad][ s - b[irad] ] ) {
if ( s - b[irad] > 0 && ( (P[irad][ (s - b[irad]) / 30 ] >> ((s - b[irad]) % 30) ) &1 ) == 1 ) {
l = irad * rad;
for (i = (irad-1) * rad + 1; i <= l; i++)
if (a[i] == s - b[irad])
return v[i];
}
return -1;
}
int main () {
FILE *f = fopen ("arbore.in", "r");
FILE *g = fopen ("arbore.out", "w");
fscanf (f, "%d %d", &n, &m);
for (i = 1; i < n; i++) {
fscanf (f, "%d %d", &x, &y);
V[x].push_back (y);
V[y].push_back (x);
}
DFS(1);
rad = (int)sqrt((double) n);
for (i = 1; i <= rad + 1; i++)
P[i][0] = 1;
for (i = 1; i <= m; i++ ){
fscanf (f, "%d", &tip);
if (tip == 1) {fscanf (f, "%d %d", &p, &s); update(p, s); }
else {fscanf (f, "%d", &s); fprintf (g, "%d\n", query(s)); }
}
fclose (f);
fclose (g);
return 0;
}