F - Absolute Minima


Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 600600 points

Problem Statement

There is a function f(x)f(x), which is initially a constant function f(x)=0f(x)=0.

We will ask you to process QQ queries in order. There are two kinds of queries, update queries and evaluation queries, as follows:

  • An update query 1 a b: Given two integers aa and bb, let g(x)=f(x)+|x−a|+bg(x)=f(x)+|x−a|+b and replace f(x)f(x) with g(x)g(x).
  • An evaluation query 2: Print xx that minimizes f(x)f(x), and the minimum value of f(x)f(x). If there are multiple such values of xx, choose the minimum such value.

We can show that the values to be output in an evaluation query are always integers, so we ask you to print those values as integers without decimal points.

Constraints

  • All values in input are integers.
  • 1≤Q≤2×1051≤Q≤2×105
  • −109≤a,b≤109−109≤a,b≤109
  • The first query is an update query.

Input

Input is given from Standard Input in the following format:

QQ
Query1Query1
::
QueryQQueryQ

See Sample Input 1 for an example.

Output

For each evaluation query, print a line containing the response, in the order in which the queries are given.

The response to each evaluation query should be the minimum value of xx that minimizes f(x)f(x), and the minimum value of f(x)f(x), in this order, with space in between.


Sample Input 1 Copy

Copy

4
1 4 2
2
1 1 -8
2

Sample Output 1 Copy

Copy

4 2
1 -3

In the first evaluation query, f(x)=|x−4|+2f(x)=|x−4|+2, which attains the minimum value of 22 at x=4x=4.

In the second evaluation query, f(x)=|x−1|+|x−4|−6f(x)=|x−1|+|x−4|−6, which attains the minimum value of −3−3 when 1≤x≤41≤x≤4. Among the multiple values of xx that minimize f(x)f(x), we ask you to print the minimum, that is, 11.


Sample Input 2 Copy

Copy

4
1 -1000000000 1000000000
1 -1000000000 1000000000
1 -1000000000 1000000000
2

Sample Output 2 Copy

Copy

-1000000000 3000000000

本质上是和东北赛一样的中位数经典应用

只是本题更多的考察是关于中位数的维护

1e5次添加 查询

那么我们使用两个优先队列

一个表示数组的前半部分另一个就表示数组的后半部分

那么我们就可以通过两个优先队列的转移来维护中位数

代码

#include<bits/stdc++.h>
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> >q2;//后半部分
priority_queue<long long,vector<long long>,less<long long> >q1;//前半部分
long long sum1,sum2;//qian hou
int main()
{
    long long sum1=0,sum2=0;
    long long num=0;
    int op;
    int q;
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d",&op);
        if(op==1)
        {
            long long temp1,temp2;
            scanf("%lld%lld",&temp1,&temp2);
            num+=temp2;
            if(!q1.size()||temp1<q1.top()) q1.push(temp1),sum1+=temp1;
            else q2.push(temp1),sum2+=temp1;
            //维持均匀
            while(q1.size()<q2.size())
            {
                //cout<<"*";
                long long temp;
                temp=q2.top();
                q2.pop();
                q1.push(temp);
                sum2-=temp;
                sum1+=temp;
            }
            while(q1.size()-1>q2.size())
            {
                //cout<<"2";
                long long temp;
                temp=q1.top();
                q1.pop();
                q2.push(temp);
                sum1-=temp;
                sum2+=temp;
            }
        }
        else
        {
            long long sum=q1.size()+q2.size();
            long long ans;
            if(q1.size()&&q2.size())
            ans=1LL*q1.top()*q1.size()-sum1+sum2-q1.top()*q2.size()+num;
            else if(q1.size())
            {
                ans=num;
            }
//            cout<<num<<" ";
//            cout<<sum1<<" "<<sum2<<q1.size()<<" "<<q2.size()<<endl;
            printf("%lld %lld\n",q1.top(),ans);
        }
    }
}