Cod sursa(job #777761)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 13 august 2012 12:48:06
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000005
using namespace std;

char buff[20];
int com[300001][2];
int x,n,nrc,i,NrMax,poz,found;

struct element {int maxim; int minim; int dif;};
element tree[1<<19+4];

int maximum(int xx, int yy)
{if(xx>yy)
  return xx;
return yy;}

int minimum(int xx, int yy)
{if(xx<yy)
  return xx;
return yy;}

void build(int nod, int left, int right)
{int mij=(left+right)/2;
 tree[nod].maxim=-inf;
 tree[nod].minim=inf;
 tree[nod].dif=inf;
 if(left==right)
    return;
 build(2*nod,left,mij);
 build(2*nod+1,mij+1,right);
}

void update(int nod, int left, int right, int val)
{if(left==right)
   {tree[nod].dif=inf;
    if(val)
    {tree[nod].maxim=val;
    tree[nod].minim=val;}
    else
    {tree[nod].maxim=-inf;
     tree[nod].minim=inf;}   
    return;}
 int mij=(left+right)/2;
 if(poz<=mij)
   update(2*nod,left,mij,val);
 else   
   update(2*nod+1,mij+1,right,val);
 tree[nod].maxim=maximum(tree[2*nod].maxim,tree[2*nod+1].maxim);
 tree[nod].minim=minimum(tree[2*nod].minim,tree[2*nod+1].minim);  
 tree[nod].dif=minimum(minimum(tree[2*nod].dif, tree[2*nod+1].dif), (tree[2*nod+1].minim-tree[2*nod].maxim));
     
}

int search(int nod, int left, int right, int val)
{if(left==right)
   {if(tree[nod].maxim==val)
      return 1;
   else
      return 0;}
 int mij=(left+right)/2;
 if(poz<=mij)
   return search(2*nod,left,mij,val);
 else
   return search(2*nod+1,mij+1,right,val);     
}

int get_number()
{int nrn=0;
while(buff[nrc]<='9' && buff[nrc]>='0')
   {nrn=nrn*10+buff[nrc]-'0';
    nrc++;}
return nrn;   
}

void afisare()
{for(int jj=1; jj<=2*NrMax-1; jj++)
   printf("%d ",tree[jj].maxim);
 printf("\n");  
}

int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
n=0;
while(gets(buff))
{if(buff[0]=='I')
    {n++;
    com[n][0]=1;
    nrc=2;
    com[n][1]=get_number();
    if(NrMax<com[n][1])
      NrMax=com[n][1]; }
 if(buff[0]=='S')
    {n++;
    com[n][0]=2;
    nrc=2;
    com[n][1]=get_number();}
 if(buff[0]=='C')
    {n++;
    com[n][0]=3;
    nrc=2;
    com[n][1]=get_number();}
 if(buff[2]=='N')
    {n++;
    com[n][0]=4;}
 if(buff[2]=='X')
    {n++;
    com[n][0]=5;}
  }
found=1;
found=0;
build(1,1,NrMax);

for(i=1; i<=n; i++)
{if(com[i][0]==1)
   {poz=com[i][1];
    update(1,1,NrMax,poz);}
 if(com[i][0]==2)
   {poz=com[i][1];
    found=search(1,1,NrMax,poz);
    if(!found)
    printf("-1\n");
    else
    update(1,1,NrMax,0);
    }
 if(com[i][0]==3)
   {poz=com[i][1];
    found=search(1,1,NrMax,poz);
    printf("%d\n",found);
   }
 if(com[i][0]==4)
   {found=tree[1].dif;
   printf("%d\n",found);
   }
 if(com[i][0]==5)
   {found=tree[1].maxim-tree[1].minim;
   printf("%d\n",found);
   }
 //afisare();  
}

return 0;}