Pagini recente » Diferente pentru problema/cristalegcd intre reviziile 11 si 10 | Monitorul de evaluare | Istoria paginii utilizator/seika | Diferente pentru utilizator/maxine80 intre reviziile 3 si 1 | Cod sursa (job #2035980)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("heavyPath.in");
ofstream out("heavyPath.out");
#define ll long long
#define ull unsigned long long
#define pb push_back
const int NMax = 1e5 + 5;
int T;
int val[NMax],depth[NMax],euler[2*NMax],rmq[2*NMax][21],lin[2*NMax],first[NMax],last[NMax];
vector<int> v[NMax];
void buildEuler(int,int);
void buildLin(int,int);
int main() {
in>>N>>M;
for (int i=1;i <= N;++i) {
in>>v[i];
}
for (int i=1;i <= N;++i) {
int x,y;
in>>x>>y;
v[x].pb(y);
v[y].pb(x);
}
buildEuler(1,0);
lg[1] = 0;
rmq[1][0] = euler[1];
for (int i=2;i <= euler[0];++i) {
lg[i] = lg[i/2] + 1;
rmq[i][0] = euler[i];
}
for (int p=1;(1<<p) <= euler[0];++p) {
for (int i=1;i + (1<<p) - 1 <= N;++i) {
int node1 = rmq[i][p-1],
node2 = rmq[j+(1<<(p-1))][p-1];
if (depth[node1] < depth[node2]) {
rmq[i][p] = node1;
}
else {
rmq[i][p] = node2;
}
}
}
buildLin(1,0);
while (M--) {
int tip,a,b;
in>>tip>>a>>b;
if (tip) {
}
else {
}
}
in.close();out.close();
return 0;
}
void buildEuler(int node,int dad) {
euler[ ++euler[0] ] = node;
posEuler[node] = euler[0];
depth[node] = depth[dad] + 1;
for (int nxt : v[node]) {
if (nxt == dad) {
continue;
}
buildEuler(nxt,node);
}
}
void buildLin(int node,int dad) {
lin[ ++lin[0] ] = val[node];
first[node] = lin[0];
for (int nxt : v[node]) {
if (nxt == dad) {
continue;
}
buildLin(nxt,node);
}
lin[ ++lin[0] ] = -val[node];
last[node] = lin[0];
}