107382024-04-10 23:32:1542Főnökszámpypy3Time limit exceeded 40/100481ms118068 KiB
from sys import stdin, stdout
input=stdin.readline

from bisect import bisect_left as lower_bound
from bisect import bisect_right as upper_bound

class FenwickTree:
    def __init__(self, x):
        bit = self.bit = list(x)
        size = self.size = len(bit)
        for i in range(size):
            j = i | (i + 1)
            if j < size:
                bit[j] += bit[i]

    def update(self, idx, x):
        """updates bit[idx] += x"""
        while idx < self.size:
            self.bit[idx] += x
            idx |= idx + 1

    def __call__(self, end):
        """calc sum(bit[:end])"""
        x = 0
        while end:
            x += self.bit[end - 1]
            end &= end - 1
        return x

    def find_kth(self, k):
        """Find largest idx such that sum(bit[:idx]) <= k"""
        idx = -1
        for d in reversed(range(self.size.bit_length())):
            right_idx = idx + (1 << d)
            if right_idx < self.size and self.bit[right_idx] <= k:
                idx = right_idx
                k -= self.bit[idx]
        return idx + 1, k

class SortedList:
    block_size = 700

    def __init__(self, iterable=()):
        self.macro = []
        self.micros = [[]]
        self.micro_size = [0]
        self.fenwick = FenwickTree([0])
        self.size = 0
        for item in iterable:
            self.insert(item)

    def insert(self, x):
        i = lower_bound(self.macro, x)
        j = upper_bound(self.micros[i], x)
        self.micros[i].insert(j, x)
        self.size += 1
        self.micro_size[i] += 1
        self.fenwick.update(i, 1)
        if len(self.micros[i]) >= self.block_size:
            self.micros[i:i + 1] = self.micros[i][:self.block_size >> 1], self.micros[i][self.block_size >> 1:]
            self.micro_size[i:i + 1] = self.block_size >> 1, self.block_size >> 1
            self.fenwick = FenwickTree(self.micro_size)
            self.macro.insert(i, self.micros[i + 1][0])

    def pop(self, k=-1):
        i, j = self._find_kth(k)
        self.size -= 1
        self.micro_size[i] -= 1
        self.fenwick.update(i, -1)
        return self.micros[i].pop(j)

    def __getitem__(self, k):
        i, j = self._find_kth(k)
        return self.micros[i][j]

    def count(self, x):
        return self.upper_bound(x) - self.lower_bound(x)

    def __contains__(self, x):
        return self.count(x) > 0

    def lower_bound(self, x):
        i = lower_bound(self.macro, x)
        return self.fenwick(i) + lower_bound(self.micros[i], x)

    def upper_bound(self, x):
        i = upper_bound(self.macro, x)
        return self.fenwick(i) + upper_bound(self.micros[i], x)

    def _find_kth(self, k):
        return self.fenwick.find_kth(k + self.size if k < 0 else k)

    def __len__(self):
        return self.size

    def __iter__(self):
        return (x for micro in self.micros for x in micro)

    def __repr__(self):
        return str(list(self))


def main():
    # n^4/3*log(n)
    N = int(input())

    L = SortedList()
    A,B = [int(x) for x in input().split()]
    L.insert((A,-B))
    stdout.write('1\n')

    for _ in range(N-1):
        A,B = [int(x) for x in input().split()]
        i = upper_bound(L,(A,-B))
        if i==len(L):
            if B<=-L[-1][1]:
                L.insert((A,-B))
            else:
                L.insert((A,-B))
                while len(L)>1 and B>-L[-2][1] and A>L[-2][0]:
                    #print(L,A,-B)
                    L.pop(-2)
                    #print(L)
        else:
            if B<-L[i][1] and A<L[i][0]:
                pass
            else:
                L.insert((A,-B))
                while i>0 and B>-L[i-1][1] and A>L[i-1][0]:
                    #print(L,A,-B)
                    L.pop(i-1)
                    i-=1
                    #print(L)
        stdout.write(str(len(L))+'\n')
        
main()
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted48ms80560 KiB
2Accepted268ms106336 KiB
subtask25/5
3Accepted45ms80996 KiB
4Accepted48ms80892 KiB
5Accepted75ms88208 KiB
6Accepted112ms93244 KiB
subtask310/10
7Accepted46ms81988 KiB
8Accepted56ms88236 KiB
9Accepted61ms89644 KiB
10Accepted65ms86652 KiB
11Accepted87ms91184 KiB
12Accepted90ms89280 KiB
13Accepted129ms93600 KiB
14Accepted123ms94564 KiB
subtask40/10
15Accepted48ms82312 KiB
16Accepted48ms82496 KiB
17Accepted83ms91000 KiB
18Accepted103ms94444 KiB
19Accepted112ms94840 KiB
20Accepted130ms97044 KiB
21Accepted136ms97448 KiB
22Time limit exceeded469ms41036 KiB
subtask525/25
23Accepted79ms90348 KiB
24Accepted86ms90752 KiB
25Accepted118ms96056 KiB
26Accepted123ms95480 KiB
27Accepted194ms104584 KiB
28Accepted223ms105688 KiB
29Accepted254ms110596 KiB
30Accepted254ms108096 KiB
subtask60/50
31Accepted45ms83972 KiB
32Accepted263ms108980 KiB
33Accepted45ms80996 KiB
34Accepted48ms80892 KiB
35Accepted75ms88208 KiB
36Accepted112ms93244 KiB
37Accepted46ms81988 KiB
38Accepted56ms88236 KiB
39Accepted61ms89644 KiB
40Accepted65ms86652 KiB
41Accepted87ms91184 KiB
42Accepted90ms89280 KiB
43Accepted129ms93600 KiB
44Accepted123ms94564 KiB
45Accepted48ms82312 KiB
46Accepted48ms82496 KiB
47Accepted83ms91000 KiB
48Accepted103ms94444 KiB
49Accepted112ms94840 KiB
50Accepted130ms97044 KiB
51Accepted136ms97448 KiB
52Time limit exceeded469ms41036 KiB
53Accepted79ms90348 KiB
54Accepted86ms90752 KiB
55Accepted118ms96056 KiB
56Accepted123ms95480 KiB
57Accepted194ms104584 KiB
58Accepted223ms105688 KiB
59Accepted254ms110596 KiB
60Accepted254ms108096 KiB
61Accepted123ms95056 KiB
62Accepted287ms111328 KiB
63Accepted123ms96580 KiB
64Time limit exceeded444ms118068 KiB
65Accepted119ms96948 KiB
66Accepted123ms97456 KiB
67Accepted118ms96992 KiB
68Accepted120ms95864 KiB
69Accepted300ms109528 KiB
70Time limit exceeded481ms43308 KiB