求救,求帮交QAQ
查看原帖
求救,求帮交QAQ
1254229
fzark楼主2024/10/25 15:17
class B:
    def __init__(self, l=None, r=None, v=None):
        self.next = None
        self.l = l
        self.r = r
        self.val = v

    def __lt__(self, other):
        return self.val < other.val


def sp(mid):
    cur = root
    while cur:
        if cur.l == mid + 1: return cur
        if cur.l <= mid and mid + 1 <= cur.r:
            cur.next = B(mid + 1, cur.r, cur.val)
            cur.r = mid
            return cur.next
        cur = cur.next


def p(l, r):
    return sp(l - 1), sp(r)


def mg(l, r, v):
    lb, rb = p(l, r)
    lb.r = r
    lb.val = v
    lb.next = rb


def add(l, r, val):
    lb, rb = p(l, r)
    cur = lb
    while cur != rb:
        cur.val += val
        cur = cur.next

def olp(n):
    np = [0] * (n + 1)
    np[1] = 1
    prime = []
    s = set()
    for i in range(2, n + 1):
        if not np[i]: prime.append(i);s.add(i)
        for j in prime:
            if i * j > n: break
            np[i * j] = 1
            if i % j == 0: break
    return s
import math
def isPri(n):
    if n < 2:return False
    for i in range(2,int(math.sqrt(n)) + 1):
        if n % i == 0:return False
    return True

primes = olp(pow(10, 7))

n, q = map(int, input().split())
a = list(map(int, input().split()))
root = B(1, 1, a[0])
cur = root
for i in range(1, n):
    cur.next = B(i + 1, i + 1, a[i])
    cur = cur.next
for i in range(q):
    line = input().split()
    if line[0] == 'A':
        v, l = map(int, line[1:])
        add(l, l, v)

    if line[0] == 'R':
        a, l, r = map(int, line[1:])
        mg(l, r, a)

    if line[0] == 'Q':
        l, r = map(int, line[1:])
        cnt = 0
        cur, rb = p(l, r)
        while cur != rb:
            if cur.val < pow(10,7) and cur.val in primes:
                if cur.val <= pow(10, 7):  cnt += cur.r - cur.l + 1
            cur = cur.next
        print(cnt)


2024/10/25 15:17
加载中...