Cod sursa(job #2923876)
| Utilizator | Data | 20 septembrie 2022 12:06:26 | |
|---|---|---|---|
| Problema | Arbori indexati binar | Scor | 30 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.26 kb |
#include <bits/stdc++.h>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,op,poz,val,p1,p2,a;
vector<int> AIB(100005,0);
void update(int j,int adaug)
{
while(j<=n)
{
AIB[j]+=adaug;
j+=(j&-j);
}
}
int PS(int j)
{
int sum=0;
while(j>0)
{
sum+=AIB[j];
j-=(j&-j);
}
return sum;
}
int main()
{
in >> n >> m;
int c;
for(int i=1;i<=n;i++)
{
in >> c;
update(i,c);
}
for(int i=1;i<=m;i++)
{
in >> op;
if(op==0)
{
in >> poz >> val;
update(poz,val);
}
else if(op==1)
{
in >> p1 >> p2;
out << PS(p2)-PS(p1-1) << '\n';
}
else
{
in >> a;
int k,ok;
k=1;
ok=0;
while(k<=n)
{
if(PS(k)==a)
{
out << k << '\n';
ok=1;
break;
}
k++;
}
if(ok==0)
out << "-1" << '\n';
}
}
return 0;
}
