Pagini recente » Cod sursa (job #2738439) | Cod sursa (job #2195000) | Cod sursa (job #1507723) | Cod sursa (job #2659823) | Cod sursa (job #1943636)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
struct elem
{
int st,dr,val;
}a[100003];
int n,m,x,p,y,z;
void preconstruire(int st,int dr,int poz)
{
a[poz].st=st;
a[poz].dr=dr;
a[poz].val=0;
if(st!=dr)
{
preconstruire(st,(st+dr)/2,2*poz);
preconstruire((st+dr)/2+1,dr,2*poz+1);
}
}
void adauga(int &i,int &x,int poz)
{
a[poz].val+=x;
if(a[poz].st!=a[poz].dr)
{
if(a[2*poz].st<=i&&a[2*poz].dr>=i)
adauga(i,x,2*poz);
else
adauga(i,x,2*poz+1);
}
}
int suma(int &st, int &dr,int poz)
{
if(a[poz].st>=st&&a[poz].dr<=dr)
return a[poz].val;
else
{
int sum=0;
if(a[2*poz].dr>=st&&a[2*poz].st<=dr)
sum+=suma(st,dr,2*poz);
if(a[2*poz+1].dr>=st&&a[2*poz+1].st<=dr)
sum+=suma(st,dr,2*poz+1);
return sum;
}
}
int pozitie(int poz,int &val)
{
if(a[poz].val==val)
{
val=0;
return a[poz].dr;
}
if(a[poz].st==a[poz].dr)
return -1;
if(a[2*poz].val<val)
{
val=val-a[2*poz].val;
return pozitie(2*poz+1,val);
}
else
return pozitie(2*poz,val);
}
int main()
{
fin>>n>>m;
preconstruire(1,n,1);
for(int i=1;i<=n;i++)
{
fin>>x;
adauga(i,x,1);
}
for(int i=1;i<=m;i++)
{
fin>>p;
if(p==0)
{
fin>>x>>y;
adauga(x,y,1);
}
else
if(p==1)
{
fin>>x>>z;
y=suma(x,z,1);
fout<<y<<"\n";
}
else
{
fin>>x;
y=pozitie(1,x);
fout<<y<<"\n";
}
}
return 0;
}