Pagini recente » Cod sursa (job #226983) | Cod sursa (job #2222101) | Cod sursa (job #1220437) | Borderou de evaluare (job #2366999) | Cod sursa (job #3349397)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const long long NMAX=100007;
long long aib[NMAX],v[NMAX];
long long n,m,c;
long long a,b;
void up(long long i,long long val){
for(;i<=n;i+=i&-i)
{
aib[i]+=val;
}
}
long long qersum(long long i){//suma pe 1,2,3...,i
long long sum=0;
for(;i>0;i-=i&-i)
{
sum+=aib[i];
}
return sum;
}
long long qerk(long long a){
long long bit=1;
while(bit<=n)
{
bit=bit<<1;
}
long long k=0;
while(bit>=2)
{
bit=bit>>1;
k+=bit;
if(k<=n&&aib[k]<=a)
{
a-=aib[k];
}
else
{
k-=bit;
}
}
if(a==0)
{
return k;
}
else{return -1;}
}
int main()
{
in>>n>>m;
for(long long i=1;i<=n;i++)
{
in>>v[i];
up(i,v[i]);
}
for(long long j=1;j<=m;j++)
{
in>>c;
if(c==0)
{
in>>a>>b;
up(a,b);
}
else if(c==1)
{
in>>a>>b;
out<<qersum(b)-qersum(a-1)<<"\n";
}
else{
in>>a;
out<<qerk(a)<<"\n";
}
}
}