Cod sursa(job #2013205)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 20 august 2017 19:46:34
Problema Reuniune Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
using namespace std;
ifstream fin("ruine.in");
ofstream fout("ruine.out");
int n,m,q,j,k,v1[400005],v2[400005],a[100005],q1,q2,val,i;

char x;
void Update(int nod,int st,int dr)
           {int mid=(st+dr)/2;
            if(q<=mid)v1[nod]=1;
              else v2[nod]=1;
            if(st!=dr){if(q<=mid)Update(nod*2,st,mid);
                       else Update(nod*2+1,mid+1,dr);
                      }
           }
void Question1(int nod)
             {if(nod>=k)q1=nod;
                else {if(v2[nod]==1&&nod*2+1<q+k-1)Question1(nod*2+1);
                      else if(v1[nod]==1&&nod*2<q+k-1)Question1(nod*2);
                     }
             }
void Question2(int nod)
             {fout<<nod<<"|";
              if(nod>=k){q2=nod;fout<<"("<<nod<<","<<k<<") ";
                        }
                else {if(v1[nod]==1)Question2(nod*2);
                      else if(v2[nod]==1)Question2(nod*2+1);
                     }
             }
int main()
{fin>>n>>m;
 for(i=1;i<=n;i++)
    {fin>>a[i];
     a[i]=a[i]+a[i-1];
    }
    k=1;
 while(k<n)k=k*2;
 for(i=1;i<=k+n-1;i++)
    v1[i]=v2[i]=0;
 for(i=1;i<=m;i++)
    {fin>>x>>q;
     q1=0;
     q2=n;
     if(x=='S'){Update(1,1,k);v1[q]=1;}
      else {val=q+k-1;
            while(val%2==0&&val>1)val=val/2;
            while(v1[val]==0&&val>1)val=val/2;
            val=val*2;
            //fout<<val<<" ";
            Question1(val);
            fout<<q1<<" ";

            val=q+k-1;
            if(v1[val]==1)fout<<val<<"| \n";
            else{
            while(val%2==1&&val>1)val=val/2;
            while(v2[val]==0&&val>1)val=val/2;
            val=val*2+1;
            //fout<<val<<" ";
            Question2(val);
            fout<<q2<<"\n";
                }
           }
    }
}