diff --git a/main.cpp b/main.cpp
index cec38db6bca6a26ae9b79cb363b2a87e0409b675..41f74a235ea96fccc70edbfdc37d5cffc31678de 100644
--- a/main.cpp
+++ b/main.cpp
@@ -64,13 +64,37 @@ public:
 
   void erase_child(node<T>& t)
   {
-    for(auto it= std::begin(_childs);it!=std::end(_childs);it++)
+    for(auto&& it= std::begin(_childs);it!=std::end(_childs);it++)
       if((*it)->id() == t.id())
-        _childs.erase(it);
+      {
+        if(it == std::begin(_childs))
+        {
+          _childs.erase(it);
+          it=std::begin(_childs);
+          it--;
+        }
+        else
+        {
+          _childs.erase(it);
+          it--;
+        }
+      }
 
-    for(auto it= std::begin(_bad_childs);it!=std::end(_bad_childs);it++)
+    for(auto&& it= std::begin(_bad_childs);it!=std::end(_bad_childs);it++)
       if((*it).lock()->id() == t.id())
-        _bad_childs.erase(it);
+      {
+        if(it == std::begin(_bad_childs))
+        {
+          _bad_childs.erase(it);
+          it=std::begin(_bad_childs);
+          it--;
+        }
+        else
+        {
+          _bad_childs.erase(it);
+          it--;
+        }
+      }
   }
 
   void flow_after(std::function<bool(node<T>&)> funct)
@@ -81,12 +105,11 @@ public:
       child->flow_after(funct);
   }
 
-  void flow_before(std::function<bool(node<T>&)> funct)
+  void flow_before(std::function<void(node<T>&)> funct)
   {
     for(auto& child : _childs)
       child->flow_before(funct);
-    if (funct(*this))
-      return;
+    funct(*this);
   }
 
   node<T>& add_child(node<T>* w)
@@ -129,13 +152,12 @@ int node<T>::_id=0;
 template<class T>
 class graph
 {
-private:
+public:
   static void erase(node<T>& root , node<T>& to_del)
   {
     root.flow_after([&to_del](node<T>& t){ t.erase_child(to_del); return false; });
   }
 
-public:
   static void erase(node<T>& root , node<T>* t)
   {
     erase(root,*t);
@@ -222,7 +244,7 @@ public:
 
     bool foundround=false;
     int id=n.id();
-    flow_after(o,[&id,&foundround](node& n){if(n.id()==id) foundround=true;});
+    flow_after(o,[&id,&foundround](node& n){if(n.id()==id) foundround=true; return foundround;});
     if(!foundround)
       connections.push_back(connection{n.id(),o.id()});
     else
@@ -294,15 +316,30 @@ public:
     return ret;
   }
 
-  void run(std::function<void(T&)> funct)
+  std::vector<node*> get_not_inf_round_childs(node& n)
+  {
+    std::vector<node*> ret{};
+    for(auto& i : connections)
+    {
+      if(n.id()==i.A)
+        for(auto& re:nodes)
+          if(re.id()==i.A)
+            ret.push_back(&re);
+    }
+    return ret;
+  }
+
+  void run(std::function<bool(graph<T>::node&)> funct)
   {
     for(auto& i:nodes)
-      funct(i.data());
+      if(funct(i))
+        return;
   }
 
-  void flow_after(node& node, std::function<void(graph<T>::node&)> funct)
+  void flow_after(node& node, std::function<bool(graph<T>::node&)> funct)
   {
-    funct(node);
+    if(funct(node))
+      return;
     for(auto& i : connections)
     {
       if(node.id()==i.A)
@@ -333,30 +370,13 @@ template<class T>
 int graph<T>::node::_id=0;
 }
 
-void test()
-{
-  std::vector<recursive_storage::node<int>> a;
-  for(int i=0;i<1000000;i++)
-    a.push_back(recursive_storage::node<int>{5});
-  a[0].add_child(int{6});
-  a[0].childs()[0]->add_child(int{7});
-  a[0].childs()[0]->add_child(int{8});
-  auto to_del = a[0].childs()[0]->childs()[0];
-  a[0].childs()[0]->add_child(a[0]);
-  a[0].flow_after([]( recursive_storage::node<int>& elem ){ std::cout<<"inf rounds from here:"<<elem.inf_round_childs().size()<<" .id:"; std::cout<< elem.id() << ":" << elem.data() <<std::endl; return false; });
-  recursive_storage::graph<int>::erase(a[0],to_del);
-  a[0].flow_after([]( recursive_storage::node<int>& elem ){ std::cout<<"inf rounds from here:"<<elem.inf_round_childs().size()<<" .id:"; std::cout<< elem.id() << ":" << elem.data() <<std::endl; return false; });
-}
-
-int main()
+void test1(int num)
 {
   time_t start,end;
-  //std::cout<<localtime(&now)->tm_sec<<std::endl;
-
-  std::cout<<"test1 : create 10000000 1 node graph"<<std::endl;
+  std::cout<<"test1 : create "<<num<<" 1 node graph"<<std::endl;
   start=time(0);
   {
-    for(size_t i=0;i<10000000;i++)
+    for(size_t i=0;i<num;i++)
     {
       local_storage::graph<int> graph{};
       graph.add_node(6);
@@ -364,31 +384,32 @@ int main()
   }
   end=time(0);
   std::cout<<"local_storage: "
-            <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m"
-            <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s"<<std::endl;
+            <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec-
+            localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl;
   start=time(0);
   {
-    for(size_t i=0;i<10000000;i++)
+    for(size_t i=0;i<num;i++)
     {
       recursive_storage::node<int> node{6};
     }
   }
   end=time(0);
   std::cout<<"recursive_storage: "
-            <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m"
-            <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s";
+            <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec-
+            localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl;
+}
 
-  std::cout<<"test1 : create 100000 5 node full connected graph"<<std::endl;
+void test2(int num)
+{
+  time_t start,end;
+  std::cout<<"test2 : create "<<num<<" 5 node full connected graph"<<std::endl;
   start=time(0);
   {
-    for(size_t i=0;i<100000;i++)
+    for(size_t i=0;i<num;i++)
     {
       local_storage::graph<int> graph{};
-      graph.add_node(6);
-      graph.add_node(6);
-      graph.add_node(6);
-      graph.add_node(6);
-      graph.add_node(6);
+      for(size_t j=0;j<5;j++)
+        graph.add_node(6);
       for(size_t j=0;j<5;j++)
         for(size_t l=0;l<5;l++)
           graph.connect(graph[j],graph[l]);
@@ -396,34 +417,71 @@ int main()
   }
   end=time(0);
   std::cout<<"local_storage: "
-            <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m"
-            <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s"<<std::endl;
+            <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec-
+            localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl;
   start=time(0);
   {
-    for(unsigned int i=0;i<100000;i++)
+    for(size_t i=0;i<num;i++)
     {
       recursive_storage::node<int> node{6};
       for(size_t j=0;j<4;j++)
         node.add_child(6);
-      auto& childs= node.childs();
-      for(auto& child:childs)
-        for(auto& child2:childs)
-          child.add_child(child2);
+      for(auto& child:node.childs())
+        for(auto& child2:node.childs())
+          child->add_child(*child2);
     }
   }
   end=time(0);
   std::cout<<"recursive_storage: "
-            <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m"
-            <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s";
-  local_storage::graph<int> g{};
-  g.add_node(6);
-  auto& t2=g.add_node(6);
-  auto& t = g.add_node(52);
-  g.connect(g[0],t);
-  g.connect(g[0],t2);
-  g.connect(t2,g[0]);
-  std::cout<<std::endl<<g.get_childs(t2).size()<<std::endl;
-  g.flow_before(g[0],[](local_storage::graph<int>::node& a){std::cout<<a.data()<<":"<<a.id()<<std::endl;});
-  //test();
+            <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec-
+            localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl;
+}
+
+void test3(int num)
+{
+  time_t start,end;
+  std::cout<<"test3 : create "<<num<<" 30 node line graph, search for the deepest and delete it."<<std::endl;
+  start=time(0);
+  {
+    for(size_t i=0;i<num;i++)
+    {
+      local_storage::graph<int> graph{};
+      for(size_t j=0;j<29;j++)
+        graph.add_node(6);
+      graph.add_node(30);
+      for(size_t j=1;j<30;j++)
+        graph.connect(graph[j-1],graph[j]);
+      local_storage::graph<int>::node* target;
+      graph.run([&target](local_storage::graph<int>::node& node){if(node.data()==30) {target=&node;return true;}return false;});
+      graph.erase(*target);
+    }
+  }
+  end=time(0);
+  std::cout<<"local_storage: "
+            <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec-
+            localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl;
+  start=time(0);
+  {
+    for(size_t i=0;i<num;i++)
+    {
+      recursive_storage::node<int> node{6};
+      int j=1;
+      node.flow_after([&j](recursive_storage::node<int>& n){n.add_child(++j); if(j==30)return true; return false;});
+      recursive_storage::node<int>* target=nullptr;
+      node.flow_after([&target](recursive_storage::node<int>& n){if(n.data()==30){target=&n;return true;} return false;});
+      recursive_storage::graph<int>::erase(node,target);
+    }
+  }
+  end=time(0);
+  std::cout<<"recursive_storage: "
+            <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec-
+            localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl;
+}
+
+int main()
+{
+  test1(10000000);
+  test2(1000000);
+  test3(1000000);
   return 0;
 }