比赛 收心赛 评测结果 AAAAAATTTT
题目名称 冰火战士 最终得分 60
用户昵称 PXCZM 运行时间 13.214 s
代码语言 C++ 内存使用 23.67 MiB
提交时间 2026-02-24 11:43:06
显示代码纯文本
#include <bits/stdc++.h>
#define lowbit(i) i&(-i)
using namespace std;
int q;
struct jgt
{
    int op,t,x,y;
}z[2000010];
vector<int>l1;
void lsh()
{
    for(int i=1;i<=q;i++)
        if(z[i].op==1) l1.push_back(z[i].x);
    sort(l1.begin(),l1.end());
    int len=unique(l1.begin(),l1.end())-l1.begin();
    for(int i=1;i<=q;i++)
        if(z[i].op==1) z[i].x=lower_bound(l1.begin(),l1.begin()+len,z[i].x)-l1.begin()+1;
}
int a[2000010],b[2000010];
void add1(int x,int y)
{
    for(int i=x;i<=2000000;i+=lowbit(i)) a[i]+=y;
}
int query1(int x)
{
    int ans1=0;
    for(int i=x;i;i-=lowbit(i)) ans1+=a[i];
    return ans1;
}
void add2(int x,int y)
{
    x=2000001-x;
    for(int i=x;i<=2000000;i+=lowbit(i)) b[i]+=y;
}
int query2(int x)
{
    x=2000001-x;
    int ans1=0;
    for(int i=x;i;i-=lowbit(i)) ans1+=b[i];
    return ans1;
}
pair<int,int>ans;
void solve()
{
    int l=1,r=2000000;
    int tp1,tp2;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        tp1=query1(mid),tp2=query2(mid);
        if(tp2>=tp1) l=mid+1;
        else r=mid-1;
        if(min(tp1,tp2)*2>ans.second)
        {
            ans.first=mid;
            ans.second=min(tp1,tp2)*2;
        }
        else if(min(tp1,tp2)*2==ans.second&&ans.first<mid) ans.first=mid;
    }
    l=ans.first,r=2000000;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(min(query1(mid),query2(mid))*2==ans.second)
        {
            ans.first=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
}
int main()
{
    freopen("icefire.in","r",stdin);
    freopen("icefire.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>z[i].op>>z[i].t;
        if(z[i].op==1) cin>>z[i].x>>z[i].y;
    }
    lsh();
    for(int i=1;i<=q;i++)
    {
        ans.first=ans.second=0;
        if(z[i].op==1)
        {
            if(z[i].t==0) add1(z[i].x,z[i].y);
            else add2(z[i].x,z[i].y);
            solve();
        }
        else
        {
            int k=z[i].t;
            if(z[k].t==0) add1(z[k].x,-z[k].y);
            else add2(z[k].x,-z[k].y);
            solve();
        }
        if(ans.second) cout<<l1[ans.first-1]<<' '<<ans.second<<'\n';
        else cout<<"Peace\n";
    }
    return 0;
}