Fenwick:forum(20/100)

è 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 :slight_smile:

#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;
	}
}
1 Mi Piace

Ciao, forse ho trovato un caso in cui sbaglia:

 3 2 2
 -1 0 1 2 2
 1 2
 2 4

Ad ogni modo non credo che i fenwick siano utilizzabili per dei maximum range update, penso che tu debba usare un segment tree.

1 Mi Piace

grazie mille per il supporto ho trovato pure io quell errore che si presenta poichè quando richiamo la query la condizione di uscita dal ciclo era sbagliata fixxando quest ultima, aggiungendo un vettore che mi dice qual è la provenienza di quel nodo comunque da 20/100 ma penso di cambiare totalmente strategia

1 Mi Piace