Pagini recente » Cod sursa (job #73519) | Cod sursa (job #3146764) | Cod sursa (job #2026363) | Cod sursa (job #2289967) | Cod sursa (job #571332)
Cod sursa(job #571332)
#include<fstream>
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
int aib[100010],v[100010];
int n,m;
//functia incrementeaza v[x] cu 'val' in arborele indexat binar
void add(int x,int val)
{
int i;
for (i=x;i<=n;i+=zeros(i))
aib[i]+=val;
}
//calculeaza suma elementelor pe intervalul [1,x]
int suminterval(int x)
{
int i,s=0;
for (i=x;i>0;i-=zeros(i))
s+=aib[i];
return s;
}
int cauta(int val)
{
int i,pas;
for (pas=1;pas<n;pas<<=1);
for (i=0;pas;pas>>=1)
{
if (i+pas<=n&&val>=aib[i+pas])
{
i+=pas;
val-=aib[i];
if (!val)
return i;
}
}
return -1;
}
int main()
{
int i,op,k,j,s;
ifstream in("aib.in");
in>>n>>m;
for (i=1;i<=n;i++)
{
in>>v[i];
add(i,v[i]);
}
ofstream out("aib.out");
for (i=1;i<=m;i++)
{
in>>op>>k;
if (op==1)
{
in>>j;
s=suminterval(j);
s-=suminterval(k-1);
out<<s<<'\n';
}
else if (op==0)
{
in>>j;
add(k,j);
v[k]+=j;
}
else
out<<cauta(k)<<'\n';
}
}