Nu aveti permisiuni pentru a descarca fisierul grader_test2.in
Cod sursa(job #1584361)
| Utilizator | Data | 29 ianuarie 2016 23:15:51 | |
|---|---|---|---|
| Problema | Arbori indexati binar | Scor | 0 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.26 kb |
#include <cstdio>
using namespace std;
int arb[100001],n;
int tata(int k)
{
return k&(k-1);
}
int next(int k)
{
return k+((k^(k-1))+1)/2;
}
void aduna(int i,int x)
{
do
{
arb[i]+=x;
i=next(i);
}while(i<=n);
}
int suma(int i)
{
int s=0;
while(i)
{
s+=arb[i];
i=tata(i);
}
return s;
}
int det(int s)
{
int li=1,lf=n,m=(li+lf)/2;
while(li<=lf&&arb[m]!=s)
{
if(s<arb[m])
lf=m-1;
else
li=m+1;
m=(li+lf)/2;
}
if(li>lf)return -1;
return m;
}
int main()
{
int m,x,i,y,z,op;
FILE *f=fopen("aib.in","r"),*f1;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&x);
aduna(i,x);
}
f1=fopen("aib.out","w");
for(i=1;i<=m;i++)
{
fscanf(f,"%d",&op);
if(op==0)
{
fscanf(f,"%d%d",&x,&y);
aduna(x,y);
}
if(op==1)
{
fscanf(f,"%d%d",&x,&y);
fprintf(f1,"%d\n",suma(y)-suma(x-1));
}
if(op==2)
{
fscanf(f,"%d",&x);
fprintf(f1,"%d\n",det(x));
}
}
return 0;
}
