Pagini recente » Cod sursa (job #1455792) | Cod sursa (job #798485) | Cod sursa (job #2044842) | Cod sursa (job #857381) | Cod sursa (job #2123497)
#include <fstream>
using namespace std;
int aib[100005], n,m;
int Query(int p)
///care este suma a[1]+a[2] + ... + a[n]
{
int s = 0;
while(p > 0)
{
s+= aib[p];
p-=(p&(-p));
}
return s;
}
void Update(int p, int x)
///adauga x la pozitia p
{
while(p <= n)
{
aib[p] += x;
p+=(p&(-p));
}
}
int CautaRez(int S)
{
int st, dr, mid, p, suma;
p=-1;
st = 1; dr = n;
while(st <= dr)
{
mid = (st + dr)/2;
suma = Query(mid);
if(suma== S) { p = mid; dr = mid -1;}
else if(suma > S) dr = mid-1;
else st = mid + 1;
}
return p;
}
int main()
{
int x,p,p2,i, op;
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> n >> m;
for(i = 1; i <= n; i++)
{
fin >> x;
Update(i,x);
}
for(i = 1; i <= m; i++)
{
fin >> op;
if(op == 0)
{
fin >> x >> p;
Update(p,x);
}
else if(op == 1)
{
fin >> p >> p2;
fout << Query(p2) - Query(p-1) << "\n";
}
else
{
fin >> x;
fout << CautaRez(x) << "\n";
}
}
fout.close();
return 0;
}