板子题
按照ppt所说的,预留0号位和n+1号位,0号位位于2的若干次方的位置。
但是我试了一下。。。没有严格要求的这样的写法,这题也能A,数据有点水。
#include<algorithm>
#include<vector>
#include<iostream>
#include<math.h>
#include<cstring>
#include<string>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#include<queue>
#include<assert.h>
#include<iomanip>
#include<bitset>
#define qcin; ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define pb push_back
#define mp make_pair
#define clr(x) memset(x,0,sizeof x)
#define fmax(x) memset(x,0x3f,sizeof x)
#define finit(x) memset(x,-1,sizeof x)
#define iio(n,m) io(n),io(m)
#define ls(p) (p<<1)
#define rs(p) ((p<<1)|1)
#define dis(l,r) r-l+1
#define gstr(str) scanf("%s",str)
#define glen(str) strlen(str)
using namespace std;
namespace Input{
const int BUF = 65536;
char buf[BUF + 1];
char *head = buf, *tail = buf;
}
inline char inputchar(){
using namespace Input;
if(head == tail)
*(tail = (head = buf) + fread(buf, 1, BUF, stdin)) = 0;
return *head++;
}
template<class T>
inline void io(T &ret){
ret = 0;
char ch = inputchar();
while((ch < '0' || ch > '9') && ch != '-')
ch = inputchar();
bool neg = false;
if(ch == '-')
neg = true, ch = inputchar();
while(ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
ch = inputchar();
}
if(neg)
ret = -ret;
}
typedef long long ll;
typedef pair<int,int>pll;
const int maxn = 1e6+10;
const int mod = 1e8+7;
const ll inf = 1e18;
typedef ll arr[maxn];
typedef char str[maxn];
void file(int x){if(x&&fopen("123.in","r")){freopen("123.in","r",stdin);}}
const long double pi = acos(-1);
arr sum,L,add;
int n,q,m,op,l,r,k,d;
void upd(int ql,int qr,int k,int d){
for(int l=ql+m-1,r=qr+m+1;l^r^1;l>>=1,r>>=1){
if(l&1^1)sum[l^1]+=k+(L[l^1]-ql)*d,add[l^1]+=d;
if(r&1) sum[r^1]+=k+(L[r^1]-ql)*d,add[r^1]+=d;
}
}
ll qry(int p,ll res=0){
for(int i=m+p;i;i>>=1)res+=sum[i]+(p-L[i])*add[i];
return res;
}
int main(){
file(1);
iio(n,q);
for(m=1;m-2<=n;m<<=1);
for(int i=1;i<=n;i++)io(sum[m+i]);
for(int i=m-1;~i;i--)L[i+m]=i;
for(int i=m-1;i;i--)L[i]=L[i<<1];
while(q--){
io(op);
if(op==1){
iio(l,r),iio(k,d);
upd(l,r,k,d);
}else {
io(l);
printf("%lld\n",qry(l));
}
}
return 0;
}