Pagini recente » Cod sursa (job #3194864) | Cod sursa (job #1280153) | Cod sursa (job #571768) | Cod sursa (job #291591) | Cod sursa (job #2220183)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
long long n,m,aib[100010];
void update(long long poz, long long val)
{
while (poz<=n)
{
aib[poz]+=val;
poz+=poz&(-poz);
}
}
void sum (long long start, long long stop)
{
start--;
long long sum1=0, sum2=0;
while (start>0)
{
sum1+=aib[start];
start-=start&(-start);
}
while (stop>0)
{
sum2+=aib[stop];
stop-=stop&(-stop);
}
g<<sum2-sum1<<"\n";
}
void gasesc (long long val)
{
long long poz=1;
long long i=0;
while (poz<=n) poz*=2;
i=0;
while (poz!=0)
{
if (i+poz<=n)
{
if (val>=aib[i+poz])
{
val-=aib[i+poz];
i+=poz;
}
if (val==0 && i!=0) {g<<i<<"\n";return;}
}
poz/=2;
}
g<<"-1\n";
}
int main()
{
long long i,c,x,y;
f>>n>>m;
for (i=1;i<=n;i++)
{
f>>x;
update(i, x);
}
for (i=1;i<=m;i++)
{
f>>c;
if (c==0) {f>>x>>y; update(x, y); }
if (c==1)
{
f>>x>>y;
sum(x, y);
}
if (c==2)
{
f>>x;
gasesc(x);
}
}
return 0;
}