Cod sursa(job #977187)

Utilizator andrettiAndretti Naiden andretti Data 24 iulie 2013 23:32:35
Problema Zeap Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.77 kb
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<vector>
#define pb push_back
#define mp make_pair
#define v first
#define index second
#define maxn 300005
#define mod 666013
#define aitmax 1<<21
#define inf 0x3f3f3f3f
using namespace std;

struct question{int type,val,key;} q[maxn],sorted[maxn];
struct segment_tree{int minn,maxx,diff;} ait[aitmax];
int ind,nr,nrs,nri;
int pos[maxn];
bool inside[maxn];
vector < pair<int,int> > norm[mod];
char s[20];

int hash_key(int k)
{
    return k%mod;
}

int normalize(int val)
{
    int k=hash_key(val);
    for(unsigned int i=0;i<norm[k].size();i++)
     if(norm[k][i].v==val)
      return norm[k][i].index;

    norm[k].pb(mp(val,++ind));
    return ind;
}

int number()
{
    int val=0;
    for(int i=2;s[i]>='0' && s[i]<='9';i++) val=val*10+s[i]-'0';
    return val;
}

void add(int t,int num,int k)
{
    q[nr].type=t;
    q[nr].val=num;
    q[nr].key=k;
}

void read()
{
    int valc;
    while(!feof(stdin))
    {
        memset(s,'n',sizeof(s));
        fgets(s,sizeof(s),stdin);
        if(s[0]=='I')
        {
            nr++; valc=number(); add(1,valc,normalize(valc));
            sorted[++nrs]=q[nr];
            continue;
        }
        if(s[0]=='S') {nr++; valc=number(); add(2,valc,normalize(valc)); continue;}
        if(s[0]=='C') {nr++; valc=number(); add(3,valc,normalize(valc)); continue;}
        if(s[0]=='M' && s[1]=='A') {q[++nr].type=4; continue;}
        if(s[0]=='M' && s[1]=='I') {q[++nr].type=5; continue;}
        scanf("\n");
    }
}

int cmp(question i,question j){
    return i.val<j.val;
}

void build(int k,int left,int right)
{
    ait[k].minn=inf; ait[k].maxx=0; ait[k].diff=inf;
    if(left==right) return;
    int mid=(left+right)/2;
    build(2*k,left,mid);
    build(2*k+1,mid+1,right);
}

void preproc()
{
    int i;
    sort(sorted+1,sorted+nrs+1,cmp);
    sorted[0].val=-1;
    for(i=1;i<=nrs;i++)
     if(sorted[i].val!=sorted[i-1].val)
      sorted[++nri]=sorted[i];

    for(i=1;i<=nri;i++) pos[sorted[i].key]=i;

    build(1,1,nri);
}

void update(int k,int left,int right,int poss,int value)
{
    if(left==right)
    {
        ait[k].minn=value;
        ait[k].maxx=value;
        if(!value) ait[k].minn=inf;
        return ;
    }

    int mid=(left+right)/2;
    if(poss<=mid) update(2*k,left,mid,poss,value);
    else update(2*k+1,mid+1,right,poss,value);

    ait[k].minn=min(ait[2*k].minn,ait[2*k+1].minn);
    ait[k].maxx=max(ait[2*k].maxx,ait[2*k+1].maxx);
    ait[k].diff=min(ait[2*k].diff,ait[2*k+1].diff);
    ait[k].diff=min(ait[k].diff,ait[2*k+1].minn-ait[2*k].maxx);
}

void solve()
{
    for(int i=1;i<=nr;i++)
    {
        if(q[i].type==1)
        {
            if(!inside[q[i].key]) update(1,1,nri,pos[q[i].key],q[i].val);
            inside[q[i].key]=true;
            continue;
        }
        if(q[i].type==2)
        {
            if(!inside[q[i].key]) printf("-1\n");
            else
             update(1,1,nri,pos[q[i].key],0),inside[q[i].key]=false;
            continue;
        }
        if(q[i].type==3)
        {
            if(inside[q[i].key]) printf("1\n");
            else printf("0\n");
            continue;
        }
        if(q[i].type==4)
        {
            if(ait[1].minn==ait[1].maxx) printf("-1\n");
            else printf("%d\n",ait[1].maxx-ait[1].minn);
            continue;
        }
        if(q[i].type==5)
        {
            if(ait[1].minn==ait[1].maxx) printf("-1\n");
            else printf("%d\n",ait[1].diff);
        }
    }
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);

    read();
    preproc();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}