Cod sursa(job #2313414)
| Utilizator | Data | 6 ianuarie 2019 20:45:38 | |
|---|---|---|---|
| Problema | Arbori indexati binar | Scor | 0 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.05 kb |
#include <bits/stdc++.h>
#define Dim 100006
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int N,M,AIB[Dim],dif;
int op,a,b;
void Update(int it)
{
do
{
AIB[it]+=dif;
it+= it & -it;
}while(it<=N);
}
int SUM(int it)
{
int s=0;
while(it)
{
s+=AIB[it];
it&=it-1;
}
return s;
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;i++)
{
f>>a;
dif=a;
Update(i);
}
for(int i=1;i<=M;i++)
{
f>>op;
if(op==0)
{
f>>a>>b;
dif=b;
Update(a);
}
else
if(op==1)
{
f>>a>>b;
g<<SUM(b)-SUM(a-1)<<'\n';
}
else
{
f>>a;
bool stop=0;
for(int i=1;i<=N;i*=2)
if(SUM(i)==a)
{
g<<i<<'\n';
stop=1;
}
if(stop==0) g<<-1<<'\n';
}
}
return 0;
}
