记录编号 |
316103 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[ZJOI 2007] 报表统计 |
最终得分 |
100 |
用户昵称 |
AntiLeaf |
是否通过 |
通过 |
代码语言 |
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];
}