Pagini recente » Cod sursa (job #1975415) | Cod sursa (job #3031027) | Cod sursa (job #1891518) | Cod sursa (job #1821255) | Cod sursa (job #1740273)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100001];
int n,n2;
int query(int x)
{
int sol=0;
for(int i=x;i>0;i=(i&(i-1)))
{
sol+=aib[i];
}
return sol;
}
void update(int x,int y)
{
for(int i=x;i<=n;i=2*i-(i&(i-1)))
{
aib[i]+=y;
}
}
int caut(int x)
{
int sol=0,poz=0;
for(int i=n2;i>0;i=i/2)
{
if(poz+i<=n && sol+aib[poz+i]<=x)
{
sol=sol+aib[poz+i];
poz=poz+i;
}
}
if(sol==x)
return poz;
else
return -1;
}
int main()
{
int m;
in>>n>>m;
for(int i=1;i<=n;i++)
{
in>>aib[i];
aib[i]+=query(i-1)-query(i&(i-1));
}
for(n2=1;n2<=n;n2=n2*2)
{}
n2=n2/2;
for(int i=1;i<=m;i++)
{
int op;
in>>op;
if(op==0)
{
int x,y;
in>>x>>y;
update(x,y);
}
else if(op==1)
{
int x,y;
in>>x>>y;
out<<query(y)-query(x-1)<<'\n';
}
else
{
int x;
in>>x;
out<<caut(x)<<'\n';
}
}
}