Pagini recente » Cod sursa (job #2469291) | Cod sursa (job #2624018) | Cod sursa (job #1817930) | Cod sursa (job #1549191) | Cod sursa (job #3260591)
#include <bits/stdc++.h>
#define NMAX 100500
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int tree[NMAX], n, v[NMAX];
void update(int poz,int val)
{
for(int i=poz;i<=n;i+=i&(-i))
tree[i]+=val;
}
int query(int poz)
{
int s=0;
for(int i=poz;i>0;i-=i&(-i))
s+=tree[i];
return s;
}
int binar(int val)
{int st, dr, mij;
st=1;
dr=n;
while(st<dr)
{
mij=(st+dr)/2;
if(query(mij)>=val)
dr=mij;
else st=mij+1;
}
if(query(st)!=val)
return -1;
return st;
}
int bin(int val)
{
int st=0;
while(val>0 && tree[st+1]<=val)
{
st++;
while(st+(st&(-st))<=n && tree[st+(st&(-st))]<=val)
st+=(st&(-st));
val-=tree[st];
}
if(val!=0 || st>n)
return -1;
return st;
}
//void afis();
int m, a, b,c;
int main()
{
fin>>n>>m;
for(int i=1;i<=n;++i)
{
fin>>v[i];
update(i,v[i]);
}
for(int i=1;i<=m;++i)
{
fin>>c;
if(c==0)
{
fin>>a>>b;
update(a,b);
}
if(c==1)
{
fin>>a>>b;
fout<<query(b)-query(a-1)<<'\n';
}
if(c==2)
{
fin>>a;//fout<<a<<" ";
fout<<binar(a)<<'\n';
}
}
return 0;
}
//void afis()
//{
// for(int i=1;i<=n;++i)
// cout<<tree[i]<< " ";
// cout<<'\n';
//
//}