tp: reuse bookkeping variables in ii()

Reuse overlap scratch buffers in PushPartition via clear() and std::swap
instead of allocating per query. Also narrow idx_in_table from int64_t
to uint32_t (136B vs 80B) which means smaller vector allocations and
more data on cache lines. Id is already defined as uint32_t in
interval_tree.h, so this is fine.

This is a ~8% (-189ms) performance improvement in _w_independent_cpus_calc,
a 11-way intersect table in wattson_dsu_devfreq_system_state test.

Bug: 454944449
Test: tools/diff_test_trace_processor.py out/linux_clang_release/trace_processor_shell
diff --git a/src/trace_processor/plugins/interval_intersect/interval_intersect.cc b/src/trace_processor/plugins/interval_intersect/interval_intersect.cc
index 1b48862..944448c 100644
--- a/src/trace_processor/plugins/interval_intersect/interval_intersect.cc
+++ b/src/trace_processor/plugins/interval_intersect/interval_intersect.cc
@@ -70,7 +70,7 @@
 struct MultiIndexInterval {
   uint64_t start;
   uint64_t end;
-  std::array<int64_t, kIdCols> idx_in_table;
+  std::array<uint32_t, kIdCols> idx_in_table;
 };
 
 ColType FromSqlValueTypeToBuilderType(SqlValue::Type type) {
@@ -142,7 +142,7 @@
   std::vector<uint32_t> tables_order(tables_count);
   std::iota(tables_order.begin(), tables_order.end(), 0);
   std::sort(tables_order.begin(), tables_order.end(),
-            [intervals_in_table](const uint32_t idx_a, const uint32_t idx_b) {
+            [&intervals_in_table](const uint32_t idx_a, const uint32_t idx_b) {
               return intervals_in_table[idx_a]->intervals.size() <
                      intervals_in_table[idx_b]->intervals.size();
             });
@@ -165,6 +165,7 @@
   // Create an interval tree on all tables except the smallest - the first one.
   std::vector<MultiIndexInterval> overlaps_with_this_table;
   overlaps_with_this_table.reserve(intervals_in_table.back()->intervals.size());
+  Intervals new_overlaps;
   for (uint32_t i = 1; i < tables_count && !last_results.empty(); i++) {
     overlaps_with_this_table.clear();
     uint32_t table_idx = tables_order[i];
@@ -175,12 +176,11 @@
     IntervalIntersector cur_intersector(
         intervals_in_table[table_idx]->intervals, mode);
     for (const auto& prev_result : last_results) {
-      Intervals new_overlaps;
+      new_overlaps.clear();
       cur_intersector.FindOverlaps(prev_result.start, prev_result.end,
                                    new_overlaps);
       for (const auto& overlap : new_overlaps) {
-        MultiIndexInterval m_int;
-        m_int.idx_in_table = prev_result.idx_in_table;
+        MultiIndexInterval m_int = prev_result;
         m_int.idx_in_table[table_idx] = overlap.id;
         m_int.start = overlap.start;
         m_int.end = overlap.end;
@@ -188,7 +188,7 @@
       }
     }
 
-    last_results = std::move(overlaps_with_this_table);
+    std::swap(last_results, overlaps_with_this_table);
   }
 
   auto rows_count = static_cast<uint32_t>(last_results.size());