http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1159
因为只有加点 没有删点 所以线段树维护
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct date {
int lt,rt,val,pre;
}node[412345];
bool vis[112345];
void build_tree( int lt,int rt,int t )
{
node[t].lt = lt; node[t].rt = rt;
node[t].val = 0; node[t].pre = 0;
if( lt == rt )return;
int mid = ( lt + rt )>>1;
build_tree( lt,mid,t<<1 );
build_tree( mid+1,rt,t<<1|1 );
}
void update( int pre,int pos,int val,int t )
{
if( node[t].lt == node[t].rt )
{
node[t].val += val;
node[t].pre = pos;
return;
}
if( node[t<<1].rt >= pos )
update( pre,pos,val,t<<1 );
else update( pre,pos,val,t<<1|1 );
if( node[t<<1].val > node[t<<1|1].val )
{
node[t].val = node[t<<1].val;
node[t].pre = node[t<<1].pre;
}
else
{
node[t].val = node[t<<1|1].val;
if( node[t<<1].val == node[t<<1|1].val )
node[t].pre = max( node[t<<1].pre,node[t<<1|1].pre );
else node[t].pre = node[t<<1|1].pre;
}
}
int query( int t )
{
if( node[t].lt == node[t].rt )return node[t].lt;
if( node[t<<1].val > node[t<<1|1].val )
return query( t<<1 );
else if( node[t<<1].val < node[t<<1|1].val )
return query( t<<1|1 );
else if( node[t<<1].pre > node[t<<1|1].pre )
return query( t<<1 );
else return query( t<<1|1 );
}
int main( )
{
int N,val,x,y; char str[3];
while( scanf("%d",&N) != EOF && N )
{
build_tree( 1,N,1 ); bool fell = false;
memset( vis,0,sizeof(vis) );
int k = 1;
for( int i = 1; i <= N; i++ )
{
scanf("%s",&str);
if( str[0] == 'N' )
{
scanf("%d",&val);
update( i,k++,val,1 );
}
if( str[0] == 'I' )
{
scanf("%d%d",&x,&y);
if( vis[x] )continue;
update( i,x,y,1 );
}
if( str[0] == 'D' )
{
scanf("%d%d",&x,&y );
if( vis[x] )continue;
update( i,x,y*(-1),1 );
}
if( str[0] == 'E' )
{
scanf("%d",&x);
update( i,x,(1<<30)*-1,1 );
vis[x] = true;
}
if( str[0] == 'S' )
{
if( fell ){printf(" ");}
fell = true;
printf("%d",query( 1 ));
}
}
cout<<endl;
}
return 0;
}



所有评论(0)