POJ 2926加强版,使用set处理,,
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
const int M= 60005;
#define inf 1e100
int a[M][5];
int n,dem;
multiset<int>q[1<<5];
int main()
{
while (~scanf("%d%d", &n ,&dem))
{
int ans , t;
int op;
multiset<int>::iterator it,its;
for(int i=0;i<(1<<5);i++)
q[i].clear();
for(int i=1; i<=n; ++i)
{
scanf("%d",&op);
if(!op)
{
for(int j=0; j<dem; ++j)
{
scanf("%d",&a[i][j]);
}
for (int s=0; s<(1<<dem); s++)
{
t = 0;
for (int j=0; j<dem; j++)
{
if ((1<<j) & s)
t += a[i][j];
else
t -= a[i][j];
}
q[s].insert(t); //该点该状态下的值
}
}
else
{
int del;
scanf("%d",&del);
for (int s=0; s<(1<<dem); s++)
{
t = 0;
for (int j=0; j<dem; j++)
{
if ((1<<j) & s)
t += a[del][j];
else
t -= a[del][j];
}
it=q[s].find(t);
q[s].erase(it); //关于该点的记录全部删除
}
}
ans=0;
for (int s=0; s<(1<<dem); s++)
{
it=q[s].begin();
its=q[s].end();
its--;
ans=max(ans,(*its)-(*it));
}
cout<<ans<<endl;
}
}
return 0;
}