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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define l(x) t[(x)].l #define r(x) t[(x)].r #define tag(x) t[(x)].tag #define res(x) t[(x)].max using namespace std;
const int MAXN = 5e6 + 10;
struct Segment { int max; int l; int r; int tag; }t[MAXN << 3];
struct Interval { int x, y; int l; bool operator < (const Interval &p) { return l < p.l; } }p[MAXN];
int base[MAXN << 1], n, m, cnt;
void build(int p, int x, int y) { l(p) = x, r(p) = y; if (x != y) { int mid = (x + y) >> 1; build(p << 1, x, mid); build(p << 1 | 1, mid + 1, y); } }
inline void pushdown(int p) { if (l(p) != r(p) && tag(p) != 0) { int x = tag(p); tag(p << 1) += x; res(p << 1) += x; tag(p << 1 | 1) += x; res(p << 1 | 1) += x; tag(p) = 0; } }
void printtree(int p) { printf("--%d:[%d,%d]--\n", p, l(p), r(p)); printf("max=%d\n", res(p)); printf("tag=%d\n", tag(p)); if (l(p) != r(p)) { printf("ls: %d, rs: %d\n", p << 1, p << 1 | 1); printtree(p << 1); printtree(p << 1 | 1); } }
void modify(int p, int x, int y, int val) { if (x > y) return; if (x <= l(p) && r(p) <= y) { tag(p) += val; res(p) += val; return; } int mid = (l(p) + r(p)) >> 1; pushdown(p); if (x <= mid) { modify(p << 1, x, y, val); } if (mid < y) { modify(p << 1 | 1, x, y, val); } res(p) = max(res(p << 1), res(p << 1 | 1)); }
int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d%d", &p[i].x, &p[i].y); p[i].l = p[i].y - p[i].x; base[++cnt] = p[i].x; base[++cnt] = p[i].y; } sort(base + 1, base + cnt + 1); cnt = unique(base + 1, base + cnt + 1) - base - 1; for (int i = 1; i <= n; i++) { p[i].x = lower_bound(base + 1, base + cnt + 1, p[i].x) - base; p[i].y = lower_bound(base + 1, base + cnt + 1, p[i].y) - base;
} sort(p + 1, p + n + 1); build(1, 1, cnt); int pos = 1, ans = 0x3f3f3f3f; for (int i = 1; i <= n; i++) {
modify(1, p[i].x, p[i].y, 1);
if (res(1) == m) { ans = min(ans, p[i].l - p[pos].l); } while (res(1) == m && pos <= i) {
ans = min(ans, p[i].l - p[pos].l); if (pos != 0) {
modify(1, p[pos].x, p[pos].y, -1);
} pos++; } } if (ans != 0x3f3f3f3f) printf("%d\n", ans); else puts("-1"); return 0; }
|