Pagini recente » Cod sursa (job #2620679) | Cod sursa (job #2305678) | Cod sursa (job #898463) | Cod sursa (job #3042180) | Cod sursa (job #1675757)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,v[100001],a,b,x,max1;
struct nod
{
int in,fin,suma;
nod *st,*dr,*tata;
} *tot,*c;
void suma1()
{
if(tot->in<tot->fin)
{
int mij=(tot->in+tot->fin)/2;
c=new(nod);
c->tata=tot;
tot->st=c;
c->in=tot->in;
c->fin=mij;
tot=c;
suma1();
tot=tot->tata;
c=new(nod);
c->tata=tot;
tot->dr=c;
c->in=mij+1;
c->fin=tot->fin;
tot=c;
suma1();
tot=tot->tata;
tot->suma=tot->dr->suma+tot->st->suma;
}
else
{
tot->suma=v[tot->in];
tot->st=0;
tot->dr=0;
}
}
void citire()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
tot=new(nod);
tot->in=1;
tot->fin=n;
tot->suma=0;
tot->tata=0;
suma1();
}
void adaugare()
{
if(tot->in<tot->fin)
{
int mij=(tot->in+tot->fin)/2;
tot->suma+=b;
if(a<=mij)
{
tot=tot->st;
adaugare();
}
else
{
tot=tot->dr;
adaugare();
}
}
else
{
tot->suma+=b;
while(tot->tata!=0)
{
tot=tot->tata;
}
}
}
void val(int prim, int ult)
{
int mid=(tot->in + tot->fin)/2;
if(tot->in<prim)
{
if(prim<=mid)
{
if(ult>mid)
{
tot=tot->st;
val(prim, mid);
tot=tot->tata;
tot=tot->dr;
val(mid+1,ult);
tot=tot->tata;
}
else
{
tot=tot->st;
val(prim,ult);
tot=tot->tata;
}
}
if(prim>mid)
{
tot=tot->dr;
val(prim,ult);
tot=tot->tata;
}
}
else if(tot->in==prim and tot->fin==ult)
{
max1+=tot->suma;
}
else
{
if(ult<=mid)
{
tot=tot->st;
val(prim,ult);
tot=tot->tata;
}
else
{
tot=tot->st;
val(prim,mid);
tot=tot->tata;
tot=tot->dr;
val(mid+1,ult);
tot=tot->st;
}
}
}
void progr()
{
pula:;
while(tot->suma>a)
{
tot=tot->st;
}
if(tot->suma==a)
{
fout<<tot->fin<<'\n';
}
else
{
a-=tot->suma;
tot=tot->tata;
tot=tot->dr;
goto pula;
}
}
int main()
{
citire();
for(int j=1;j<=m;j++)
{
fin>>x;
if(x==0)
{
fin>>a>>b;
v[a]+=b;
adaugare();
}
if(x==1)
{
max1=0;
fin>>a>>b;
val(a,b);
fout<<max1<<'\n';
}
if(x==2)
{
fin>>a;
progr();
while(tot->tata)
{
tot=tot->tata;
}
}
}
}