Cod sursa(job #213729)
#include <fstream>
#define lg_max 100010
#define lol ((poz^(poz-1))&poz)
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int n,m,sir[lg_max];
void update(int poz,int val)
{
while (poz<=n)
{
sir[poz]+=val;
poz+=lol;
}
}
int suma(int poz)
{
int S=0;
while (poz>0)
{
S+=sir[poz];
poz-=lol;
}
return S;
}
void citire()
{
fin>>n>>m;
int val;
for (int i=0;i<n;i++)
{
fin>>val;
update(i+1,val);
}
}
int nasol(int S)
{
//aicea trebe sa aflu suma mpozitia masima care are suma S pana la un interval
int putere,i;
for (putere=1;putere<n;putere<<=1);
for ( i=0; putere!=0 ; putere>>=1)
{
if (i+putere<=n)
{
if (S>=sir[i+putere])
{
S-=sir[i+putere];
i+=putere;
if (!S)
return i;
}
}
}
return -1;
}
void afisare()
{
int a,b,c;
for (int i=0;i<m;i++)
{
fin>>a;
if (a==0)
{
fin>>b>>c;
update(b,c);
}
else
if (a==1)
{
fin>>b>>c;
fout<<suma(c)-suma(b-1);
fout<<"\n";
}
else
{
fin>>b;
fout<<nasol(b);
fout<<"\n";
// aicea e nasol :(
}
}
}
int main()
{
citire();
afisare();
return 0;
}