问题描述
对于一个长度为 N 的整数数列 A1,A2,⋯AN, 小蓝想知道下标 l 到 r 的部分和 ∑i=lr=Al+Al+1+⋯+Ar 是多少?
然而, 小蓝并不知道数列中每个数的值是多少, 他只知道它的 M 个部分和 的值。其中第 i 个部分和是下标 li 到 ri 的部分和 ∑j=liri=Ali+Ali+1+⋯+Ari, 值是 Si 。
输入格式
第一行包含 3 个整数 N、M 和 Q 。分别代表数组长度、已知的部分和数量 和询问的部分和数量。
接下来 M 行, 每行包含 3 个整数 li,ri,Si 。
接下来 Q 行, 每行包含 2 个整数 l 和 r, 代表一个小蓝想知道的部分和。
输出格式
对于每个询问, 输出一行包含一个整数表示答案。如果答案无法确定, 输出 UNKNOWN。
样例输入
5 3 3
1 5 15
4 5 9
2 3 5
1 5
1 3
1 2
样例输出
15
6
UNKNOWN
评测用例规模与约定
对于 10% 的评测用例, 1≤N,M,Q≤10,−100≤Si≤100 。
对于 20% 的评测用例, 1≤N,M,Q≤20,−1000≤Si≤1000 。
对于 30% 的评测用例, 1≤N,M,Q≤50,−10000≤Si≤10000 。
对于 40%40% 的评测用例, 1≤N,M,Q≤1000,−106≤Si≤106 。
对于 60%60% 的评测用例, 1≤N,M,Q≤10000,−109≤Si≤109 。
对于所有评测用例, 1≤N,M,Q≤105,−1012≤Si≤1012,1≤li≤ri≤N。数据保证没有矛盾。
运行限制
- 最大运行时间:3s
- 最大运行内存: 512M
代码:
n,m,q=map(int,input().split())
class node():
def __init__(self,w=0,v=0):
self.w=w
self.v=v
tree=[node() for i in range(n+1)]
for i in range(1,n+1):
tree[i].v=i
def find(x):
if (x==tree[x].v):
return x
tmp=tree[x].v
tree[x].v=find(tree[x].v)
tree[x].w+=tree[tmp].w
return tree[x].v
def merge(x,y,s):
x1=find(x-1)
y1=find(y)
if (x1==y1):return
else:
tree[x1].v=y1
tree[x1].w=tree[y].w-tree[x-1].w+s
return
def query(x,y):
x=x-1
if (find(x)!=find(y)):
print("UNKNOWN")
return
else:
print(tree[x].w-tree[y].w)
return
for i in range(m):
l,r,s=map(int,input().split())
merge(l,r,s)
for i in range(q):
l,r=map(int,input().split())
query(l,r)