Question: Give you an inserted sequence, and then output the final sequence. If you use the general method to query as O (N ), the line segment tree query can be optimized to log (n )....
ACCode:
# Include <iostream> # include <string. h >#include <algorithm> # include <cstdio> # define CLR (ARR, Val) memset (ARR, Val, sizeof (ARR) # define lson L, mid, RT <1 # define rson Mid + 1, R, RT <1 | 1 # define n 200005 using namespace STD; typedef struct {int L; int R; int sum ;} node; node [n <2]; struct point {int X; int y;} S1 [N]; int s [N]; void push_up (int rt) {node [RT]. sum = node [RT <1]. sum + node [RT <1 | 1]. SUM;} void build (INT l, in T r, int RT) {node [RT]. L = L; node [RT]. R = r; If (L = r) {node [RT]. sum = 1; return;} int mid = (L + r)> 1; build (lson); Build (rson); push_up (RT );} void quary (int l, int R, int RT, int Val, int X) {If (node [RT]. L = node [RT]. r) {node [RT]. sum = 0; s [node [RT]. l] = x; return;} int mid = (L + r)> 1; if (node [RT <1]. sum> = Val) quary (lson, Val, x); else quary (rson, Val-node [RT <1]. sum, x); push_up (RT);} void in (Int & A) {char ch; while (( Ch = getchar () <'0' | ch> '9'); for (a = 0; ch> = '0' & Ch <= '9 '; ch = getchar () A = A * 10 + CH-'0';} int main () {int N; while (~ Scanf ("% d", & N) {CLR (S,-1); CLR (node, 0); Build (1, n, 1 ); for (INT I = 0; I! = N; ++ I) in (S1 [I]. x), S1 [I]. X ++, in (S1 [I]. y); For (INT I = n-1; I> = 0; -- I) quary (1, n, 1, S1 [I]. x, S1 [I]. y); For (INT I = 1; I <n; ++ I) printf ("% d", s [I]); printf ("% d \ n ", s [N]);} return 0 ;}