Pagini recente » Cod sursa (job #2360585) | Cod sursa (job #2789094) | Cod sursa (job #947266) | Cod sursa (job #1647767) | Cod sursa (job #2514600)
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,m,baza;
int tree[270001];
void add(int poz,int val)
{
poz+=baza-1;
tree[poz]+=val;
poz/=2;
while(poz)
{
tree[poz]=tree[poz*2]+tree[poz*2+1];
poz/=2;
}
}
int suma(int a,int b)
{
a+=baza-1;
b+=baza-1;
int s=0;
while(a<=b)
{
if(a%2==1)
s+=tree[a],a++;
if(b%2==0)
s+=tree[b],b--;
a/=2;b/=2;
}
return s;
}
int pozSuma(int val)
{
int dr=1;
for(int pas=n-1;pas;pas/=2)
while(dr+pas<=n && suma(1,dr+pas)<=val )
dr+=pas;
if(suma(1,dr)==val)
return dr;
return -1;
}
int main()
{
cin>>n>>m;
baza=pow( 2 , (int)log2(n)+( log2(n)>(int)log2(n)?1:0 ) );
for(int i=baza;i<=baza+n-1;i++)
cin>>tree[i];
for(int k=baza/2;k;k/=2)
for(int i=k;i<=k*2-1;i++)
tree[i]=tree[i*2]+tree[i*2+1];
int q,a,b;
for(int k=1;k<=m;k++)
{
cin>>q;
if(q==0)
{
cin>>a>>b;
add(a,b);
}
else if(q==1)
{
cin>>a>>b;
cout<<suma(a,b)<<'\n';
}
else
{
cin>>a;
cout<<pozSuma(a)<<'\n';
}
}
return 0;
}