开两个线段树
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
struct node{
int s,l,r;
}tra[N*4],trb[N*4];
int n,k,a,b,q;
inline void pushup(int x){
tra[x].s=tra[x*2].s+tra[x*2+1].s;
trb[x].s=trb[x*2].s+trb[x*2+1].s;
}
void build(int x,int l,int r){
tra[x].l=l,tra[x].r=r,trb[x].l=l,trb[x].r=r;
if(l==r){
tra[x].s=0,trb[x].s=0;
return;
}
int mid=(l+r)/2;
build(x*2,l,mid),build(x*2+1,mid+1,r);
pushup(x);
}
void change(int now,int x,int k){
if(tra[now].l==tra[now].r){
tra[now].s=min(tra[now].s+k,a);
trb[now].s=min(trb[now].s+k,b);
return;
}
int mid=(tra[now].l+tra[now].r)/2;
if(x<=mid) change(now*2,x,k);
else change(now*2+1,x,k);
pushup(now);
}
int querya(int x,int l,int r){
if(tra[x].l>=l&&tra[x].r<=r) return tra[x].s;
int mid=(tra[x].l+tra[x].r)/2,sum=0;
if(l<=mid) sum=querya(x*2,l,r);//这个地方要注意,如果写成+=就过不了
if(r>mid) sum+=querya(x*2+1,l,r);
return sum;
}
int queryb(int x,int l,int r){
if(trb[x].l>=l&&trb[x].r<=r) return trb[x].s;
int mid=(trb[x].l+trb[x].r)/2,sum=0;
if(l<=mid) sum=queryb(x*2,l,r);
if(r>mid) sum+=queryb(x*2+1,l,r);
return sum;
}
signed main(){
cin>>n>>k>>a>>b>>q;
build(1,1,n);
while(q--){
int op;
cin>>op;
if(op==1){
int x,y;
cin>>x>>y;
change(1,x,y);
}
else{
int p;
cin>>p;
cout<<queryb(1,1,p-1)+querya(1,p+k,n)<<endl;
}
}
return 0;
}