记录编号 316103 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2007] 报表统计 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 6.234 s
提交时间 2016-10-06 15:08:28 内存使用 23.20 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define INF (~((1)<<(31))>>(1))
using namespace std;
const int maxn=500010;
void build(int,int,int);
void insert(int,int,int);
int mn[maxn<<2],first[maxn<<2],last[maxn<<2];
int n,m,x,d,ans=INF;
char c[30];
multiset<int>a;
multiset<int>::iterator it;
int main(){
#define MINE
#ifdef MINE
	freopen("form.in","r",stdin);
	freopen("form.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	build(1,n,1);
	while(m--){
		scanf(" %s",c);
		if(!strcmp(c,"INSERT")){
			scanf("%d%d",&x,&d);
			insert(1,n,1);
		}
		else if(!strcmp(c,"MIN_GAP"))printf("%d\n",mn[1]);
		else if(!strcmp(c,"MIN_SORT_GAP"))printf("%d\n",ans);
	}
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#else
	fclose(stdin);
	fclose(stdout);
#endif
	return 0;
}
void build(int l,int r,int rt){
	if(l==r){
		scanf("%d",&first[rt]);
		if(a.count(first[rt]))ans=0;
		it=a.lower_bound(first[rt]);
		if(it!=a.end()&&--it!=a.end())ans=min(ans,abs(*it-first[rt]));
		it=a.upper_bound(first[rt]);
		if(it!=a.end())ans=min(ans,abs(*it-first[rt]));
		a.insert(first[rt]);
		last[rt]=first[rt];
		mn[rt]=INF;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	mn[rt]=min(min(mn[rt<<1],mn[rt<<1|1]),abs(last[rt<<1]-first[rt<<1|1]));
	first[rt]=first[rt<<1];
	last[rt]=last[rt<<1|1];
}
void insert(int l,int r,int rt){
	if(l==r){
		mn[rt]=min(mn[rt],abs(d-last[rt]));
		if(a.count(d))ans=0;
		it=a.lower_bound(d);
		if(it!=a.end()&&--it!=a.end())ans=min(ans,abs(*it-d));
		it=a.upper_bound(d);
		if(it!=a.end())ans=min(ans,abs(*it-d));
		a.insert(d);
		last[rt]=d;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)insert(l,mid,rt<<1);
	else insert(mid+1,r,rt<<1|1);
	mn[rt]=min(min(mn[rt<<1],mn[rt<<1|1]),abs(last[rt<<1]-first[rt<<1|1]));
	last[rt]=last[rt<<1|1];
}