#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
long long mod;
inline long long pow_(long long a,long long b)
{
long long ans=1,base=a;
while (b)
{
if (b&1)
{
ans*=base;
ans%=mod;
}
base*=base;
base%=mod;
b>>=1;
}
return ans;
}
int main()
{
long long n,m;
scanf("%lld%lld%lld",&n,&m,&mod);
printf("%lld^%lld mod %lld=%lld\n",n,m,mod,pow_(n,m));
}
(tips:long tmd)
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAXN (int)(1e5+233)
long long ans[MAXN<<2],tag[MAXN<<2];
int n,m;
#define leftson cur<<1
#define rightson cur<<1|1
#define mid ((l+r)>>1)
#define len (r-l+1)
#define push_up ans[cur]=ans[leftson]+ans[rightson]
#define push_down down(leftson,l,mid,tag[cur]); down(rightson,mid+1,r,tag[cur]); tag[cur]=0
void build(int cur,int l,int r)
{
if (l==r)
{
scanf("%lld",&ans[cur]);
return;
}
build(leftson,l,mid);
build(rightson,mid+1,r);
push_up;
}
inline void down(int cur,int l,int r,long long k)
{
ans[cur]+=(len*k);
tag[cur]+=k;
return;
}
void add(int cur,int l,int r,int cl,int cr,long long k)
{
if (cl<=l&&r<=cr)
{
ans[cur]+=(k*len);
tag[cur]+=k;
return;
}
push_down;
if (cl<=mid) add(leftson,l,mid,cl,cr,k);
if (cr>mid) add(rightson,mid+1,r,cl,cr,k);
push_up;
}
long long query(int cur,int l,int r,int ql,int qr)
{
if (ql<=l&&r<=qr) return ans[cur];
push_down;
long long answ=0;
if (ql<=mid) answ+=query(leftson,l,mid,ql,qr);
if (qr>mid) answ+=query(rightson,mid+1,r,ql,qr);
push_up;
return answ;
}
int main()
{
scanf("%d%d",&n,&m);
build(1,1,n);
int opt,x,y;
long long k;
while(m--)
{
scanf("%d%d%d",&opt,&x,&y);
if (opt==1)
{
scanf("%lld",&k);
add(1,1,n,x,y,k);
}
else printf("%lld\n",query(1,1,n,x,y));
}
return 0;
}
(tips:傻逼纔會把len mid k寫亂位置,我是傻逼)