#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int a[N],n,len;//len=sqrt(n)
int id[N],sum[N],tag[N]; //id[i]第i个点所在的块.sum[i]第i块的和,tag[i]代表第i块修改的值
int query(int x)
{
return a[x]+tag[id[x]];
}
void add(int l,int r,int c)
{
int fx = id[l],fy=id[r];
if(fx==fy){
for(int i=l;i<=r;i++)a[i]+=c;
}
else{
//先处理起点的一块,暴力
for(int i=l;id[i]==fx;i++){
a[i]+=c;
}
//处理中间的所有块
for(int i=fx+1;i<fy;i++){
tag[i]+=c;
}
//处理最后一块
for(int i=r;id[i]==fy;i--){
a[i]+=c;
}
}
}
int main()
{
cin>>n;
len = sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
id[i] = (i-1)/len+1;
sum[id[i]]+=a[i];
}
for(int i=1;i<=n;i++){
int opt,l,r,c;
cin>>opt>>l>>r>>c;
if(opt==0){
add(l,r,c);
}
else{
cout<<query(r)<<endl;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int n,a[N],len,id[N],tag[N];
vector<int>v[N];
void update(int p)
{
v[p].clear();
for(int i=(p-1)*len+1;id[i]==p;i++){
a[i]+=tag[p];
v[p].push_back(a[i]);
}
tag[p] = 0;
sort(v[p].begin(),v[p].end());
}
void add(int l,int r,int c)
{
int fx = id[l],fy = id[r];
if(fx==fy){
for(int i=l;i<=r;i++){
a[i]+=c;
}
update(fx);
}
else{
for(int i=l;id[i]==fx;i++){
a[i]+=c;
}
update(fx);
for(int i=fx+1;i<fy;i++){
tag[i]+=c;
}
for(int i=r;id[i]==fy;i--){
a[i]+=c;
}
update(fy);
}
}
int query(int l,int r,int c)
{
int fx=id[l],fy=id[r],cnt=0;
if(fx==fy){
for(int i=l;i<=r;i++){
if(a[i]+tag[id[i]]<c)cnt++;
}
return cnt;
}
else{
for(int i=l;id[i]==fx;i++){
if(a[i]+tag[id[i]]<c)cnt++;
}
for(int i=fx+1;i<fy;i++){
cnt+=lower_bound(v[i].begin(),v[i].end(),c-tag[i])-v[i].begin();
}
for(int i=r;id[i]==fy;i--){
if(a[i]+tag[id[i]]<c)cnt++;
}
return cnt;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
len = sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
id[i] = (i-1)/len+1;
v[id[i]].push_back(a[i]);
}
for(int i=1;i<=(n-1)/len+1;i++){
sort(v[i].begin(),v[i].end());
}
for(int i=1;i<=n;i++){
int opt,l,r,c;
cin>>opt>>l>>r>>c;
if(opt==0){
add(l,r,c);
}
else cout<<query(l,r,c*c)<<"\n";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n,id[N],a[N],tag[N],len;
vector<int>v[N];
void update(int p)
{
v[p].clear();
for(int i=(p-1)*len+1;id[i]==p;i++){
a[i]+=tag[p];
v[p].push_back(a[i]);
}
tag[p] = 0;
sort(v[p].begin(),v[p].end());
}
void add(int l,int r,int c)
{
int fx=id[l],fy=id[r];
if(fx==fy){
for(int i=l;i<=r;i++){
a[i]+=c;
}
update(fx);
}
else{
for(int i=l;id[i]==fx;i++){
a[i]+=c;
}
update(fx);
for(int i=fx+1;i<fy;i++){
tag[i]+=c;
}
for(int i=r;id[i]==fy;i--){
a[i]+=c;
}
update(fy);
}
}
int query(int l,int r,int c)
{
int fx = id[l],fy=id[r],res=-2147483648;
if(fx==fy){
for(int i=l;i<=r;i++){
if(a[i]+tag[id[i]]<c)res = max(res,a[i]+tag[id[i]]);
}
if(res==-2147483648)res = -1;
return res;
}
else{
for(int i=l;id[i]==fx;i++){
if(a[i]+tag[id[i]]<c)res = max(res,a[i]+tag[id[i]]);
}
for(int i=fx+1;i<fy;i++){
int pos = lower_bound(v[i].begin(),v[i].end(),c-tag[i])-v[i].begin()-1;
if(pos>=0){
res = max(res,v[i][pos]+tag[i]);
}
}
for(int i=r;id[i]==fy;i--){
if(a[i]+tag[id[i]]<c)res = max(res,a[i]+tag[id[i]]);
}
if(res==-2147483648)res = -1;
return res;
}
}
int main()
{
cin>>n;
len = sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
id[i] = (i-1)/len+1;
v[id[i]].push_back(a[i]);
}
for(int i=1;i<=(n-1)/len+1;i++){
sort(v[i].begin(),v[i].end());
}
for(int i=1;i<=n;i++){
int opt,l,r,c;
cin>>opt>>l>>r>>c;
if(opt==0){
add(l,r,c);
}
else cout<<query(l,r,c)<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int a[N],id[N],Max[N],sum[N];
int n,len;
void update(int l,int r)
{
int fx=id[l],fy=id[r];
if(fx==fy){
if(Max[fx]!=1 && Max[fx]!=0){
for(int i=l;i<=r;i++){
if(a[i]==0 || a[i]==1)continue;
sum[id[i]]-=a[i];
a[i] = sqrt(a[i]);
sum[id[i]]+=a[i];
}
Max[fx] = 0;
for(int i=(fx-1)*len+1;id[i]==fx;i++){
Max[fx] = max(Max[fx],a[i]);
}
}
}
else{
if(Max[fx]!=0 && Max[fx]!=1){
for(int i=l;id[i]==fx;i++){
if(a[i]==0 || a[i]==1)continue;
sum[id[i]]-=a[i];
a[i] = sqrt(a[i]);
sum[id[i]]+=a[i];
}
Max[fx] = 0;
for(int j=(fx-1)*len+1;id[j]==fx;j++){
Max[fx] = max(Max[fx],a[j]);
}
}
for(int i=fx+1;i<fy;i++){
if(Max[i]!=0 && Max[i]!=1){
for(int j=(i-1)*len+1;id[j]==i;j++){
if(a[j]==0 || a[j]==1)continue;
sum[id[j]]-=a[j];
a[j] = sqrt(a[j]);
sum[id[j]]+=a[j];
}
Max[i] = 0;
for(int j=(i-1)*len+1;id[j]==i;j++){
Max[i] = max(Max[i],a[j]);
}
}
}
if(Max[fy]!=0 && Max[fy]!=1){
for(int i=r;id[i]==fy;i--){
if(a[i]==0 || a[i]==1)continue;
sum[id[i]]-=a[i];
a[i] = sqrt(a[i]);
sum[id[i]]+=a[i];
}
Max[fy] = 0;
for(int j=(fy-1)*len+1;id[j]==fy;j++){
Max[fy] = max(Max[fy],a[j]);
}
}
}
}
int query(int l,int r)
{
int fx=id[l],fy=id[r],res=0;
if(fx==fy){
for(int i=l;i<=r;i++)res+=a[i];
return res;
}
else{
for(int i=l;id[i]==fx;i++)res+=a[i];
for(int i=fx+1;i<fy;i++)res+=sum[i];
for(int i=r;id[i]==fy;i--)res+=a[i];
return res;
}
}
int main()
{
cin>>n;
len = sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
id[i] = (i-1)/len+1;
Max[id[i]] = max(Max[id[i]],a[i]);
sum[id[i]]+=a[i];
}
for(int i=1;i<=n;i++){
int opt,l,r,c;
cin>>opt>>l>>r>>c;
if(opt==0){
update(l,r);
}
else cout<<query(l,r)<<endl;
}
return 0;
}