| 比赛 | 
    20120712 | 
    评测结果 | 
    C | 
    | 题目名称 | 
    区间权最大 | 
    最终得分 | 
    0 | 
    | 用户昵称 | 
    IMSL77 | 
    运行时间 | 
    0.000 s  | 
    | 代码语言 | 
    Pascal | 
    内存使用 | 
    0.00 MiB  | 
    | 提交时间 | 
    2012-07-12 11:57:00 | 
显示代码纯文本
program max;
type
  integer=longint;
const
  maxn=110000;
var
  n,m,tot,lastl:integer;
  a,b:array[1..maxn] of integer;
  w:array[1..maxn] of int64;
  l,r:array[1..maxn] of integer;
  ans:array[1..maxn] of int64;
  ind:array[1..maxn] of integer;
  cr,dr:array[1..maxn shl 1] of integer;
  tmax:array[0..maxn shl 1] of int64;
  procedure Fopen;
  begin
    assign(input,'max.in'); reset(input);
    assign(output,'max.out'); rewrite(output);
  end;
  procedure Fclose;
  begin
    close(input); close(output);
  end;
  procedure Init;
  var
    i:integer;
  begin
    readln(n,m);
    for i:=1 to n do readln(a[i],b[i],w[i]);
    for i:=1 to m do readln(l[i],r[i]);
  end;
  procedure QSort1(l,r:integer);
  var
    i,j:integer;
    t,x:integer;
    dt:int64;
  begin
    i:=l; j:=r;
    x:=a[(l+r) shr 1];
    repeat
      while a[i]<x do inc(i);
      while a[j]>x do dec(j);
      if i<=j then
      begin
        t:=a[i]; a[i]:=a[j]; a[j]:=t;
        t:=b[i]; b[i]:=b[j]; b[j]:=t;
        dt:=w[i]; w[i]:=w[j]; w[j]:=dt;
        inc(i); dec(j);
      end;
    until i>j;
    if l<j then QSort1(l,j);
    if i<r then QSort1(i,r);
  end;
  procedure QSort2(tl,tr:integer);
  var
    i,j:integer;
    t,x:integer;
  begin
    i:=tl; j:=tr;
    x:=l[ind[(tl+tr) shr 1]];
    repeat
      while l[ind[i]]>x do inc(i);
      while l[ind[j]]<x do dec(j);
      if i<=j then
      begin
        t:=ind[i]; ind[i]:=ind[j]; ind[j]:=t;
        inc(i); dec(j);
      end;
    until i>j;
    if tl<j then QSort2(tl,j);
    if i<tr then QSort2(i,tr);
  end;
  procedure QSort3(l,r:integer);
  var
    i,j:integer;
    t,x:integer;
  begin
    i:=l; j:=r;
    x:=cr[(l+r) shr 1];
    repeat
      while cr[i]<x do inc(i);
      while cr[j]>x do dec(j);
      if i<=j then
      begin
        t:=cr[i]; cr[i]:=cr[j]; cr[j]:=t;
        inc(i); dec(j);
      end;
    until i>j;
    if l<j then QSort3(l,j);
    if i<r then QSort3(i,r);
  end;
  function bit1(x:integer):integer;
  var
    left,right,mid:integer;
  begin
    left:=1; right:=tot;
    while left<=right do
    begin
      mid:=(left+right) shr 1;
      if dr[mid]=x then exit(mid);
      if dr[mid]<x then left:=mid+1 else right:=mid-1;
    end;
  end;
  function bit2(x:integer):integer;
  var
    left,right,mid:integer;
  begin
    left:=1; right:=n;
    while left<=right do
    begin
      mid:=(left+right) shr 1;
      if x<=a[mid] then right:=mid-1 else left:=mid+1;
    end;
    exit(left);
  end;
  function max(a,b:integer):integer;
  begin
    if a<b then exit(b) else exit(a);
  end;
  function lowbit(x:integer):integer;
  begin
    exit(x and (-x));
  end;
  procedure update(k:integer; x:int64);
  begin
    while k<=tot do
    begin
      tmax[k]:=max(tmax[k],x);
      inc(k,lowbit(k));
    end;
  end;
  function query(k:integer):int64;
  var
    res:int64;
  begin
    res:=0;
    while k>0 do
    begin
      res:=max(res,tmax[k]);
      dec(k,lowbit(k));
    end;
    exit(res);
  end;
  function Answer(l,r:integer):int64;
  var
    i,pl:integer;
  begin
    pl:=bit2(l);
    for i:=pl to lastl-1 do update(bit1(b[i]),w[i]);
    lastl:=pl;
    exit(query(r));
  end;
  procedure Solve;
  var
    i:integer;
  begin
    QSort1(1,n);
    for i:=1 to m do ind[i]:=i;
    QSort2(1,m);
    for i:=1 to m do cr[i]:=r[i];
    for i:=1 to n do cr[i+m]:=b[i];
    QSort3(1,m+n);
    tot:=1; dr[1]:=cr[1];
    for i:=2 to m+n do if cr[i]<>cr[i-1] then
    begin inc(tot); dr[tot]:=cr[i]; end;
    fillchar(tmax,sizeof(tmax),0);
    lastl:=n+1;
    for i:=1 to m do ans[ind[i]]:=Answer(l[ind[i]],bit1(r[ind[i]]));
    for i:=1 to m do writeln(ans[i]);
  end;
begin
  Fopen;
  Init;
  Solve;
  Fclose;
end.