void add(char c) { if (!bits.bit_at(c - 'a')) { bits.turn_on(c - 'a'); next[c - 'a'] = new node(); } }
void dfs(int v, int u, int d, int &idx) { if(v) { dep[v] = d; par[v][0] = u; int k = 0; while(par[par[v][k]][k] >= 0) { par[v][k+1] = par[par[v][k]][k]; k++; } up.add(idx,1); down.add(idx,1); } in[v] = idx++; for(auto &e: G[v]) if(e.first != u) dfs(e.first, v, d+1, idx); if(v) { up.add(idx,-1); down.add(idx,-1); } out[v] = idx++; }
int main() { freopen ("life.out", "w", stdout); while (scanf ("%d", &n) != EOF) { scanf ("%lf%lf", &l, &r); int cnt1 = 0, cnt2 = 0; for (int i = 0; i < n; ++i) { line li; li.input(); if (sgn(li.a.x - li.b.x) == 0) { if (sgn(li.a.x - l) > 0 && sgn(li.a.x - r) < 0) ++cnt2; } else { pl[cnt1] = cal(li, l); pr[cnt1] = cal(li, r); hr[cnt1] = pr[cnt1]; id[cnt1] = cnt1; ++cnt1; } } sort (id, id + cnt1, comp); sort (hr, hr + cnt1); int ans = 0; n = unique(hr, hr + cnt1) - hr; t.clear(); for (int i = 0; i < cnt1; ++i) { int pid = lower_bound(hr, hr + n, pr[id[i]]) - hr + 1; ans += t.getsum(pid); t.update(pid + 1, 1); } ans += cnt1 * cnt2; printf ("%d\n", ans); } return 0; }
void solve() { build_tree(); char c; int u, v, w, r, s, t; while(m--) { cin >> c; if(c == 'I') { cin >> r >> s >> t; r--; u = es[r].first; v = es[r].second; if(dep[v] > dep[u]) { swap(u,v); swap(s,t); } up.add(in[u], -dist[r][0]+s); up.add(out[u], dist[r][0]-s); down.add(in[u], -dist[r][1]+t); down.add(out[u], dist[r][1]-t); dist[r][0] = s; dist[r][1] = t; } else {
int main () { int kase; for (scanf("%d", &kase); kase; --kase) { int n; scanf("%d", &n); for (int i = n - 1; i >= 0; i--) { scanf("%d", &arr[i]); tmp[i] = pii(arr[i], i); } sort(tmp, tmp + n); int mr = 1; for (int i = 0; i < n; i++) { if (i == 0 || tmp[i].X != tmp[i - 1].X) idx[i] = mr++; else idx[i] = idx[i - 1]; if (i == 0) prev[tmp[i].Y] = -1; else if (tmp[i].X != tmp[i - 1].X) prev[tmp[i].Y] = tmp[i - 1].Y; else prev[tmp[i].Y] = prev[tmp[i - 1].Y]; } for (int i = 0; i < n; i++) arr[i] = bf(arr[i], n); fq.clear(), gq.clear(); for (int i = 0; i < n; i++) { int kk = mr - arr[i]; dpf[i] = fq.query(kk) + 1; fq.update(kk, dpf[i]); } memset(maxg, 0, sizeof maxg); for (int i = 0; i < n; i++) { int kk = arr[i]; dpg[i] = gq.query(kk) + 1; gq.update(kk, dpg[i]); maxg[arr[i]] = dpg[i]; } for (int i = 1; i < mr; i++) maxg[i] = max(maxg[i], maxg[i - 1]); int ans = 0; for (int i = 0; i < n; i++) { ans = max(ans, dpf[i] + (arr[i] == 0 ? 0 : maxg[arr[i] - 1])); ans = max(ans, dpg[i]); } printf("%d\n", ans); } return 0; }
int reduce(bool t) { if(child) { return child->reduce(data)+(data!=t)?1:0; } else return(data!=t)?1:0; }