è da un pò di giorni che provo a risolvere forum ,ma non riesco a capire quale sia l errore.
ois_forum:https://training.olinfo.it/#/task/ois_forum/statement
la mia strategia risolutiva è questa:
dato in input un albero lo rimodello in un vettore tramite DFS preorder portandomi la sua posizione nel fenwick, e per ogni nodo i suoi figli.
dopo leggo la coppia di input per effettuare le 3 azioni descritte nel problema
update dal nodo x val:0.
update dal nodo x val:1.
query di un singolo nodo.
nel mio fenwick le due funzioni le ho costruite in questa maniera
UPDATE:
ad ogni richiesta incremento un contatore che mi indica se l azione che sto facendo l ho fatta prima o dopo e updato nel fenwick una coppia valore,numero dell update;
QUERY:
risalgo l albero dal nodo x fino a un nodo che non abbia come figlio quest ultimo
compio una scelta segliendo l update con il secondo indice maggiore
perchè faccio questo? se un update è venuto prima di un altro avra un indice minore e quindi verrà sovrapposto.
esempio:
5 directory-1 post
-1 0 1 2 3 4
1 0
0 1
l update 1 0 ha valore 1
l update 0 1 ha valore 0 però viene dopo l update 1 0 e per questo lo sovrappone
vi metto il mio code quaggiù:
grazie per il supporto in anticipo
#include <bits/stdc++.h>
using namespace std;
vector<int>graph[1000001];
struct ad{
int son;
int pos;
};
ad adc[1000001];
int sol[1000001];
int vet[1000001];
int fii[1000001];
int f=0,h=0,aka=0;
class fenwick{
#define LSB(X) (X & -X)
public:
fenwick(int N = 0){
tree.resize(N + 1, 0);
}
void agg(int F){
for(int i=0;i<F;i++){
fii[adc[i].pos+1]=adc[i].son;
}
}
void upd(int node,int val){
int alfa=adc[node].pos+1;
for(;alfa<=adc[node].pos+1+adc[node].son;alfa+=LSB(alfa)){
tree[alfa]=val;
vet[alfa]=aka;
}
}
int qry(int node){
int beta=adc[node].pos+1;
int x;
int fg=-1;
for(;beta>0;beta-=LSB(beta)){
if(adc[node].pos+1<=beta+fii[beta]){
if(vet[beta]>fg){
fg=vet[beta];
x=tree[beta];
}
}
}
if(vet[1]>fg){
x=tree[1];
}
return x;
}
private:
vector<int>tree;
};
int dfs(int node){
int fwp=f;
f++;
int somma=0;
for(int X:graph[node]){
somma+=dfs(X);
if(node==0){
h+=somma;
somma=0;
}
}
if(node==0){
adc[node].son=h;
}
else
{
adc[node].son=somma;
}
adc[node].pos=fwp;
return somma+1;
}
int main(){
int N,M,E,da;
fenwick flf(1000001);
cin>>N>>M>>E>>da;
for(int i=1;i<N+M;i++){
cin>>da;
graph[da].push_back(i);
}
dfs(0);
flf.agg(N+M);
int opz,val,ff=0;
for(int i=0;i<E;i++){
cin>>opz>>val;
if(opz==0){
aka++;
flf.upd(val,0);
}
if(opz==1){
aka++;
flf.upd(val,1);
}
if(opz==2){
sol[ff]=flf.qry(val);
ff++;
}
//for di debug
for(int i=0;i<N+M;i++){
cout<<flf.qry(i)<<" ";
}
cout<<endl;
}
}