原题网址:http://codeforces.com/contest/731/problem/D
对于相邻的两行,我们可以求出合法的答案区间,然后对所有的区间取一下区间并。因为只有最后一次询问,所以对于区间并,可以用差分维护,那么区间并的总复杂度只要O(C)了。
var
a:array[0..1,0..1000050] of longint;
cf:array[-1..1000050] of int64;
n,c,last,now,cnt,tot,i:longint;
function max(a,b:longint):longint;
begin if (a>b) then exit(a) else exit(b); end;
function min(a,b:longint):longint;
begin if (a<b) then exit(a) else exit(b); end;
procedure print(x:longint);
begin
writeln(x);
halt;
end;
begin
read(n,c);
last:=0;now:=1;cnt:=1;
read(a[now][0]);
for i:=1 to a[now][0] do
read(a[now][i]);
while (cnt<n) do
begin
last:=last xor 1;
now:=now xor 1;
inc(cnt);
read(a[now][0]);
for i:=1 to a[now][0] do
read(a[now][i]);
for i:=1 to max(a[last][0],a[now][0]) do
if (i>min(a[last][0],a[now][0]))
then
begin
if (a[last][0]>a[now][0])
then print(-1);
end
else
begin
if (a[last][i]=a[now][i]) then continue;
inc(tot);
if (a[last][i]<a[now][i])
then
begin
inc(cf[0]);
dec(cf[c-a[now][i]+1]);
inc(cf[c-a[last][i]+1]);
dec(cf[c]);
end
else
begin
inc(cf[c-a[last][i]+1]);
dec(cf[c-a[now][i]+1]);
end;
break;
end;
end;
for i:=0 to c do cf[i]:=cf[i-1]+cf[i];
for i:=0 to c do if (cf[i]=tot) then print(i);
print(-1);
end.