第一个点怎么也过不去
卡了半天也是3.7s
有无大佬帮我看看如何卡常
#include<bits/stdc++.h>
using namespace std;
const int N = 300005, M = 2505;
int n, m, T, L[M], R[M], cnt1, cnt2, pos[N], to[N], head[N], nxt[N], cnt, seq[N], a[N], top, POS[N];
long long yu[N], ans[N], num[M];
bool f[N], vis[N], Ch[N];
struct Change{
int x, y;
}C[M];
struct Query{
int x, y, k, ti, id;
}Q[M];
struct node{
int pos, flag, l, r, Ol, Or, val;
}st[M], t;
inline int read(){
int q = 0, w = 1;
char ch = getchar();
while(!isdigit(ch)){
ch = getchar();
}
while(isdigit(ch)){
q = q * 10 + (ch - '0');
ch = getchar();
}
return q * w;
}
inline void write(long long x){
if(x > 9){
write(x / 10);
}
putchar(x % 10 + '0');
}
inline bool cmp(Query x, Query y){
return x.k < y.k;
}
inline void add(const int u, const int v){
cnt++;
to[cnt] = v;
nxt[cnt] = head[u];
head[u] = cnt;
}
inline void change(const int x, const bool fflag){
t.flag = t.l = t.Ol = t.Or = t.pos = t.r = t.val = 0;
t.pos = x;
seq[x] = x;
f[t.pos] = 1;
bool flag1 = false;
bool flag2 = false;
if((x - 1) >= L[pos[x]] && f[x - 1] == 1){
flag1 = true;
}
if((x + 1) <= R[pos[x]] && f[x + 1] == 1){
flag2 = true;
}
if(flag1 == false && flag2 == false){
t.flag = 0;
t.val = 1;
}else{
t.flag = 1;
if(flag1 == true && flag2 == true){
t.val = (x - seq[x - 1] + 1) * (seq[x + 1] - x + 1);
t.l = seq[x - 1];
t.r = seq[x + 1];
t.Ol = x - 1;
t.Or = x + 1;
int tt = seq[x - 1];
seq[seq[x - 1]] = seq[x + 1];
seq[seq[x + 1]] = tt;
}else if(flag1 == true){
t.val = (x - seq[x - 1] + 1);
t.l = seq[x - 1];
t.Ol = x - 1;
t.r = x;
t.Or = x;
seq[x] = seq[x - 1];
seq[seq[x - 1]] = x;
}else if(flag2 == true){
t.val = (seq[x + 1] - x + 1);
t.l = seq[x + 1];
t.Ol = x + 1;
t.r = x;
t.Or = x;
seq[x] = seq[x + 1];
seq[seq[x + 1]] = x;
}
}
num[pos[x]] += t.val;
// cout<<(int)flag1<<' '<<(int)flag2<<' '<<x<<' '<<seq[x]<<' '<<seq[x - 1]<<' '<<seq[x + 1]<<' '<<x<<' '<<t.val<<endl;
if(fflag == true){
st[++top] = t;
}
}
inline long long find(const int x, const int y){
long long sum = 0;
// for(register int i = 1;i <= n;++i){
// cout<<f[i]<<' ';
// }
// cout<<endl;
if(pos[x] == pos[y]){
int len = 0;
for(register int i = x;i <= y;++i){
if(f[i] == 1){
len++;
}else{
sum += yu[len];
len = 0;
}
}
sum += yu[len];
return sum;
}
int le = 0, ri = 0, len = 0;
for(register int i = x;i <= R[pos[x]];++i){
if(f[i] == 1){
le++;
}else{
sum += yu[le];
le = 0;
}
}
for(register int i = y;i >= L[pos[y]];i--){
if(f[i] == 1){
ri++;
}else{
sum += yu[ri];
ri = 0;
}
}
len = le;
for(register int i = pos[x] + 1;i <= pos[y] - 1;++i){
if(seq[L[i]] == R[i]){
len += (R[i] - L[i] + 1);
}else{
if(f[L[i]] != 0){
len += (seq[L[i]] - L[i] + 1);
sum -= yu[seq[L[i]] - L[i] + 1];
}
sum += num[i];
sum += yu[len];
// cout<<num[i]<<endl;
len = 0;
if(f[R[i]] != 0){
len += (R[i] - seq[R[i]] + 1);
sum -= yu[R[i] - seq[R[i]] + 1];
}
}
}
sum += yu[len + ri];
return sum;
}
inline void wor(){
for(register int i = 1;i <= n;++i){
f[i] = 0;
head[i] = 0;
seq[i] = 0;
}
for(register int i = 1;i <= pos[n];++i){
num[i] = 0;
}
cnt = 0;
for(register int i = 1;i <= cnt1;++i){
Ch[C[i].x] = 1;
}
for(register int i = 1;i <= n;++i){
if(Ch[i] == 0){
add(a[i], i);
}
}
sort(Q + 1, Q + 1 + cnt2, cmp);
int ed = 1;
for(register int i = 1;i <= cnt2;++i){
for(register int j = 1;j <= cnt1;++j){
vis[C[j].x] = 0;
}
while(ed <= Q[i].k){
for(register int j = head[ed];j;j = nxt[j]){
int v = to[j];
change(v, 0);
}
ed++;
}
for(register int j = Q[i].ti;j >= 1;j--){
if(vis[C[j].x] == 0){
vis[C[j].x] = 1;
if(C[j].y <= Q[i].k){
change(C[j].x, 1);
// f[C[j].x] = 1;
}
}
}
for(register int j = Q[i].ti + 1;j <= cnt1;++j){
if(vis[C[j].x] == 0){
vis[C[j].x] = 1;
if(a[C[j].x] <= Q[i].k){
change(C[j].x, 1);
// f[C[j].x] = 1;
}
}
}
ans[Q[i].id] = find(Q[i].x, Q[i].y);
while(top){
t = st[top];
top--;
num[pos[t.pos]] -= t.val;
f[t.pos] = 0;
if(t.flag){
seq[t.l] = t.Ol;
seq[t.r] = t.Or;
}
}
}
for(register int i = 1;i <= cnt1;++i){
Ch[C[i].x] = 0;
}
}
int main(){
// freopen("site.in", "r", stdin);
// freopen("site.out", "w", stdout);
n = read(); m = read();
// T = sqrt(n);
// T = sqrt(0.8 * n);
T = 625;
for(register int i = 1;i <= n;++i){
a[i] = read();
yu[i] = 1LL * i * (i + 1) / 2;
pos[i] = (i - 1) / T + 1;
R[pos[i]] = i;
if(L[pos[i]] == 0){
L[pos[i]] = i;
}
}
// T = 500;
// T = sqrt(m);
T = 1766;
POS[0] = 1;
for(register int i = 1;i <= m;++i){
POS[i] = (i - 1) / T + 1;
if(POS[i] != POS[i - 1]){
wor();
for(register int j = 1;j <= cnt2;++j){
write(ans[j]);
puts("");
}
for(register int j = 1;j <= cnt1;++j){
a[C[j].x] = C[j].y;
}
cnt1 = 0;
cnt2 = 0;
}
int ind = read();
if(ind == 1){
cnt1++;
C[cnt1].x = read();
C[cnt1].y = read();
}else{
cnt2++;
Q[cnt2].x = read();
Q[cnt2].y = read();
Q[cnt2].k = read();
Q[cnt2].id = cnt2;
Q[cnt2].ti = cnt1;
}
}
if(cnt2 != 0){
wor();
for(register int j = 1;j <= cnt2;++j){
write(ans[j]);
puts("");
}
}
return 0;
}