1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include<bits/stdc++.h> using namespace std; #define DB double #define mp make_pair const int CN = 1e5 + 50; const DB EPS = 1e-10; int read(){ int s = 0, ne = 1; char c = getchar(); for(;c < '0' || c > '9';c = getchar()) if(c == '-') ne = -1; for(;c >= '0' && c <= '9';c = getchar()) s = (s << 1) + (s << 3) + c - '0'; return s * ne; } bool equ(DB a, DB b) {return abs(a - b) <= EPS;} int n, lastans; class SEG {public: int l, r, id; DB yl, yr; SEG() {l = id = 0, r = 1;} DB slp() {return (yr - yl) / (1.0 * (r - l));} DB mid() {return (yl + yr) / 2;} DB val(int x) {return l == r ? yl : yl + slp() * (x - l);} void cl(int x) {yl = val(x), l = x;} void cr(int x) {yr = val(x), r = x;} } ; SEG mk(int a, int b, int c, int d, int e){ SEG o; o.l = a, o.yl = b, o.r = c, o.yr = d, o.id = e; return o; } bool le(SEG a, SEG b) { return a.mid() < b.mid() || (equ(a.mid(), b.mid()) && a.id > b.id); } class SGT { public: SEG d[CN << 2]; #define lc k << 1 #define rc k << 1 | 1 void upd(int l, int r, int k, SEG x){ if(x.l < l) x.cl(l); if(x.r > r) x.cr(r); if(le(d[k], x)) swap(d[k], x); if(l == r) return; int m = (l + r) >> 1; if(x.slp() < d[k].slp()) upd(l, m, lc, x); else upd(m + 1, r, rc, x); } void md(int l, int r, int k, SEG x){ if(x.l < l) x.cl(l); if(x.r > r) x.cr(r); if(x.l == l && x.r == r) return (void)(upd(l, r, k, x)); int m = (l + r) >> 1; if(x.l <= m) md(l, m, lc, x); if(m < x.r) md(m + 1, r, rc, x); } pair<DB, int> qu(int l, int r, int k, int p){ if(l == r) return mp(d[k].mid(), d[k].id); int m = (l + r) >> 1; pair<DB, int> ans; if(p <= m) ans = qu(l, m, lc, p); else ans = qu(m + 1, r, rc, p); if(d[k].val(p) > ans.first || (equ(d[k].val(p), ans.first) && d[k].id < ans.second)) ans.first = d[k].val(p), ans.second = d[k].id; return ans; } } D; int enc(int x, int p) {return (x + lastans - 1) % p + 1;} int main() { freopen("_in.in", "r", stdin); n = read(); int cnt = 0; for(int i = 1; i <= n; i++){ int tp = read(), a = read(), b, c, d; if(tp){ b = read(), c = read(), d = read(); a = enc(a, 39989), b = enc(b, 1e9), c = enc(c, 39989), d = enc(d, 1e9); if(a > c) swap(a, c), swap(b, d); D.md(1, 1e5, 1, mk(a, b, c, d, ++cnt)); } else a = enc(a, 39989), printf("%d\n", lastans = D.qu(1, 1e5, 1, a).second); } return 0; }
|