Pagini recente » Cod sursa (job #374888) | Cod sursa (job #433782) | Cod sursa (job #835510) | Cod sursa (job #1081959) | Cod sursa (job #688493)
Cod sursa(job #688493)
#include <fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int sir[270001], poz , sf , elm,suma;
void aib(int i , int j , int pos) {
if(poz>(i+j)/2) {
sir[pos]+=elm;
if(i==j)return;
aib((i+j)/2+1,j,pos*2+1);
} else if(poz<=(i+j)/2) {
sir[pos]+=elm;
if(i==j)return;
aib(i,(i+j)/2,pos*2);
}
}
void caib(int i , int j , int pos) {
if(i>=poz&&j<=sf) {
suma+=sir[pos];
return;
}
if(poz<=(i+j)/2) {
caib(i,(i+j)/2,pos*2);
}
if(sf>(i+j)/2) {
caib((i+j)/2+1,j,pos*2+1);
}
}
void saib(int i , int j , int pos) {
if(poz==i) {
if(sir[pos]<=suma) {
poz=j+1;
suma-=sir[pos];
if(!suma)elm=j;
return;
}
} else return;
if(i==j)return;
if(suma>0)
saib(i,(i+j)/2,pos*2);
if(suma>0)
saib((i+j)/2+1,j,pos*2+1);
}
int main() {
int n , m ;
fi>>n>>m;
for(int i=1; i<=n; i++) {
poz=i;
fi>>elm;
aib(1,n,1);
}
for(int i=1; i<=m; i++) {
int a,b;
fi>>a;
switch (a) {
case 0 :
fi>>a>>b;
poz=a;
elm=b;
aib(1,n,1);
continue;
case 1 :
suma=0;
fi>>a>>b;
poz=a;
sf=b;
caib(1,n,1);
fo<<suma<<'\n';
continue;
case 2:
fi>>a;
poz=1;
elm=-1;
suma=a;
saib(1,n,1);
fo<<elm<<'\n';
}
}
}