///C
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define lowbit(x) (x&(-(x)))
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
#define Mod(a, b) a<b?a:a%b+b
using namespace std;
typedef long long LL;
const int MXN = 2e5 + 7;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;
int n, m;
int sum[MXN<<2][20], lazy[MXN<<2];
/*
sum[rt][i]表示的是rt子树下第i位为1的数量
区间长度是r-l+1,这一位取反操作就是数量为len-sum[][]
lazy[rt]表示这个rt区间内异或操作数的异或和
*/
void push_up(int rt) {
for(int i = 0; i < 20; ++i) {
sum[rt][i] = sum[rt<<1][i]+sum[rt<<1|1][i];
}
}
void build(int l,int r,int rt) {
if(l == r) {
int x; scanf("%d", &x);
for(int i = 0; i < 20; ++i) {
if(x&(1<<i)) sum[rt][i] = 1;
else sum[rt][i] = 0;
}
return;
}
int mid = (l+r) >> 1;
build(l,mid,rt<<1); build(mid+1,r,rt<<1|1);
push_up(rt);
}
void push_down(int l,int r,int rt) {
if(lazy[rt] == 0) return;
lazy[rt<<1] ^= lazy[rt];
lazy[rt<<1|1] ^= lazy[rt];
int len = r - l + 1;
for(int i = 0; i < 20; ++i) {
if(lazy[rt]&(1<<i)) {
sum[rt<<1][i] = (l+r)/2 - l + 1 - sum[rt<<1][i];
sum[rt<<1|1][i] = r - (l+r)/2 - sum[rt<<1|1][i];
}
}
lazy[rt] = 0;
}
LL query(int L,int R,int l,int r,int rt) {
if(L <= l && r <= R) {
LL ans = 0;
for(int i = 0; i < 20; ++i) {
ans += ((LL)sum[rt][i]<<i);
}
return ans;
}
push_down(l,r,rt);
int mid = (l + r) >> 1;
if(L > mid) return query(L,R,mid+1,r,rt<<1|1);
else if(R <= mid) return query(L,R,l,mid,rt<<1);
return query(L,mid,l,mid,rt<<1)+query(mid+1,R,mid+1,r,rt<<1|1);
}
void update(int L,int R,int k,int l,int r,int rt) {
if(L <= l && r <= R) {
lazy[rt] ^= k;
for(int i = 0; i < 20; ++i) {
if(k&(1<<i)) sum[rt][i] = r - l + 1 - sum[rt][i];
}
return;
}
push_down(l,r,rt);
int mid = (l + r) >> 1;
if(L > mid) update(L,R,k,mid+1,r,rt<<1|1);
else if(R <= mid) update(L,R,k,l,mid,rt<<1);
else {
update(L,mid,k,l,mid,rt<<1);
update(mid+1,R,k,mid+1,r,rt<<1|1);
}
push_up(rt);
}
int main() {
scanf("%d%d", &n, &m);
int l, r, k, op;
build(1, n, 1);
while(m --) {
scanf("%d%d%d", &op, &l, &r);
if(op == 1) {
printf("%lld\n", query(l, r, 1, n, 1));
}else {
scanf("%d", &k);
update(l, r, k, 1, n, 1);
}
}
return 0;
}
///E
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define lowbit(x) (x&(-(x)))
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
#define Mod(a, b) a<b?a:a%b+b
using namespace std;
typedef long long LL;
const int MXN = 2e5 + 7;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;
int n, m;
int ar[MXN], br[MXN], now[MXN];
struct lp{
int l, r, sum;
}cw[MXN*30];
int root[MXN], tot;
void update(int l,int r,int last,int &cur,int c) {
cw[++tot] = cw[last];
cur = tot;
cw[tot].sum ++;
if(l == r) return;
int mid = (l + r) >> 1;
if(c <= mid) update(l,mid,cw[last].l,cw[tot].l,c);
else update(mid+1,r,cw[last].r,cw[tot].r,c);
}
int query(int l,int r,int cur,int c) {
if(!c) return 0;
if(l == r) return cw[cur].sum;
int mid = (l + r) >> 1;
if(c <= mid) return query(l,mid,cw[cur].l,c);
else {
int ans = cw[cw[cur].l].sum;
ans += query(mid+1,r,cw[cur].r,c);
return ans;
}
}
struct one{
int l, r, c;
}op[MXN];
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]), br[i] = ar[i];
cw[0].l = cw[0].r = cw[0].sum = 0;
int k = 100000;
int l, r, c, T = n;
for(int i = 0; i < m; ++i) {
scanf("%d%d%d", &l, &r, &c);
op[i].l = l;op[i].r = r;op[i].c = c;
br[++T] = c;
}
sort(br+1,br+1+T);
k = unique(br+1,br+1+T) - br;
for(int i = 1; i <= n; ++i) {
now[i] = lower_bound(br+1,br+k,ar[i]) - br;
}
for(int i = 1; i <= n; ++i) {
update(1, k, root[i-1], root[i], now[i]);
}
for(int i = 0; i < m; ++i) {
l = op[i].l; r = op[i].r; c = op[i].c;
c = lower_bound(br+1,br+k,c) - br;
printf("%d\n", query(1,k,root[r],c)-query(1,k,root[l-1],c));
}
return 0;
}
///D
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int MXN = 1e5 + 5;
const LL mod = 23333;
int n, m;
int ar[MXN];
int fa[MXN], dep[MXN], siz[MXN], son[MXN], top[MXN];
int tid[MXN], rtid[MXN], rnk[MXN], inde;
LL sum1[MXN<<2], sum2[MXN<<2], flag[MXN<<2];
std::vector<int> mp[MXN];
void dfs_1(int u,int ba,int D) {
dep[u] = D; son[u] = 0;
fa[u] = ba; siz[u] = 1;
for(auto v: mp[u]) {
if(v == ba) continue;
dfs_1(v, u, D + 1);
siz[u] += siz[v];
if(siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs_2(int u,int ba) {
tid[u] = ++inde;
rnk[inde] = u;
if(son[u]) {
top[son[u]] = u;
dfs_2(son[u], u);
}
for(auto v: mp[u]) {
if(v == ba || v == son[u]) continue;
top[v] = v;
dfs_2(v, u);
}
rtid[u] = inde;
}
void Mod(LL &a, LL &b, LL &c) {
if(a >= mod) a %= mod;
if(b >= mod) b %= mod;
if(c >= mod) c %= mod;
}
void push_up(int rt) {
sum1[rt] = sum1[lson] + sum1[rson];
sum2[rt] = sum2[lson] + sum2[rson];
Mod(sum1[rt], sum2[rt], flag[rt]);
}
void build(int l,int r,int rt) {
flag[rt] = 0;
if(l == r) {
sum1[rt] = ar[rnk[l]] % mod;
sum2[rt] = sum1[rt] * sum1[rt] % mod;
return;
}
int mid = (l + r) >> 1;
build(l,mid,lson), build(mid+1,r,rson);
push_up(rt);
}
void push_down(int rt, int Len) {
if(flag[rt] == 0) return;
flag[lson] += flag[rt];
flag[rson] += flag[rt];
sum2[lson] = (sum2[lson] + 2*sum1[lson]*flag[rt]%mod + flag[rt]*flag[rt]*(Len-(Len>>1)))%mod;
sum2[rson] = (sum2[rson] + 2*sum1[rson]*flag[rt]%mod + flag[rt]*flag[rt]*(Len>>1))%mod;
sum1[lson] += flag[rt]*(Len-(Len>>1));
sum1[rson] += flag[rt]*(Len>>1);
Mod(sum1[lson], sum2[lson], flag[lson]);
Mod(sum1[rson], sum2[rson], flag[rson]);
flag[rt] = 0;
}
void update(int L,int R,int c,int l,int r,int rt) {
if(L <= l && r <= R) {
flag[rt] += c;
sum2[rt] = (sum2[rt] + 2*sum1[rt]*c%mod + (LL)c*c*(r-l+1))%mod;
sum1[rt] += (LL)c*(r-l+1);
Mod(sum1[rt], sum2[rt], flag[rt]);
return;
}
push_down(rt, r-l+1);
int mid = (l + r) >> 1;
if(L > mid) update(L,R,c,mid+1,r,rson);
else if(R <= mid) update(L,R,c,l,mid,lson);
else {
update(L,mid,c,l,mid,lson);
update(mid+1,R,c,mid+1,r,rson);
}
push_up(rt);
}
LL query(int L,int R,int l,int r,int rt) {
if(L <= l && r <= R) {
return sum2[rt]%mod;
}
push_down(rt, r-l+1);
int mid = (l + r) >> 1;
if(L > mid) return query(L,R,mid+1,r,rson);
else if(R <= mid) return query(L,R,l,mid,lson);
else {
return (query(L,mid,l,mid,lson)+query(mid+1,R,mid+1,r,rson))%mod;
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%d", &ar[i]), ar[i] %= mod;
for(int i = 1, a, b; i < n; ++i) {
scanf("%d%d", &a, &b);
mp[a].push_back(b); mp[b].push_back(a);
}
inde = 0;
dfs_1(1, 1, 1);
top[1] = 1;
dfs_2(1, 1);
build(1, n, 1);
int op, x, y;
while(m --) {
scanf("%d%d", &op, &x);
if(op == 1) {
scanf("%d", &y);
y %= mod;
update(tid[x],rtid[x],y,1,n,1);
}else {
printf("%lld\n", query(tid[x],rtid[x],1,n,1));
}
}
return 0;
}
///F
///AC:
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int MXN = 1e5 + 5;
const int mod = 1000000007;
int n, m;
int dp[MXN][20];
LL ar[MXN];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]);
for(int i = 1; i <= n; ++i) {
for(int j = 0; j < 20; ++j) {
dp[i][j] = 0;
if(ar[i]&(1<<j)) dp[i][j] = dp[i-1][j] + 1;
}
}
for(int i = 2; i <= n; ++i) ar[i] += ar[i-1];
LL ans = 0;
for(int i = 1; i <= n; ++i) {
std::vector<pii> vs;
for(int j = 0; j < 20; ++j) {
vs.push_back({dp[i][j], 1<<j});
}
sort(vs.begin(), vs.end());
LL xr = 0;
int len = vs.size();
for(int j = len-1; j >= 0; --j) {
pii x = vs[j];
xr += x.second;
ans = max(ans, xr*(ar[i]-ar[i-x.first]));
}
}
printf("%lld\n", ans);
return 0;
}
///WA:
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int MXN = 1e5 + 5;
const int mod = 1000000007;
int n, m;
int dp[MXN][21];
LL ar[MXN];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%lld", &ar[i]);
for(int i = 1; i <= n; ++i) {
for(int j = 0; j <= 20; ++j) {
dp[i][j] = 0;
if(ar[i]&(1<<j)) dp[i][j] = dp[i-1][j] + 1;
}
}
for(int i = 2; i <= n; ++i) ar[i] += ar[i-1];
LL ans = 0;
for(int i = 1; i <= n; ++i) {
std::vector<pii> vs;
for(int j = 0; j <= 20; ++j) {
vs.push_back({dp[i][j], 1<<j});
}
sort(vs.begin(), vs.end());
LL res = 0, xr = 0;
int sz = 0;
int len = vs.size();
for(int j = len-1; j >= 0; --j) {
pii x = vs[j];
if(j != len-1)
sz = (ar[i-x.first]-ar[i-vs[j+1].first]);
res -= xr * sz;
res += (LL)x.second * (ar[i]-ar[i-x.first]);
ans = max(ans, res);
xr += x.second;
}
}
printf("%lld\n", ans);
return 0;
}