Pagini recente » Diferente pentru utilizator/mihnea.anghel intre reviziile 22 si 23 | Cod sursa (job #1169969) | Monitorul de evaluare | Istoria paginii utilizator/caiur | Cod sursa (job #2013205)
#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";
}
}
}
}