CF E
  • 板块灌水区
  • 楼主mazihang2025
  • 当前回复14
  • 已保存回复14
  • 发布时间2022/7/16 00:06
  • 上次更新2023/10/27 20:06:45
查看原帖
CF E
729229
mazihang2025楼主2022/7/16 00:06

RT,显然 log2\log^2 , 为什么过不了?

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

typedef long long i64;

int read() {
	int x(0), f(0);
	char ch = getchar();
	while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
	return f ? -x : x;
}
int __stk[128], __len;
void put(int x) {
	if (x < 0) putchar('-'), x = -x;
	do {
		__stk[++__len] = x % 10, x /= 10;
	} while (x);
	while (__len) putchar(__stk[__len--] ^ 48);
}

const int N = 2e5+1000, M=2e5+30;

struct Sgt {
	#define ls (x << 1)
	#define rs (x << 1 | 1)
	#define mid ((l + r) >> 1)
	int t[N << 2], tag[N <<2];
	void pushup(int x) {
		t[x] = t[ls] + t[rs];
	}
	void pushdown(int x,int l,int r) {
		if(tag[x]!=-1) {
			t[ls]=(mid-l+1)*tag[x],tag[ls]=tag[x];
			t[rs]=(r-mid)*tag[x],tag[rs]=tag[x];
			tag[x]=-1;
		}
	}
	void modify(int x, int l, int r, int L, int R, bool v) {
		if(L>R)return;
		if (l >= L && r <= R) {
			t[x]=(r-l+1)*v, tag[x]=v;
			return;
		}
		pushdown(x,l,r);
		if (mid >= L) modify(ls, l, mid, L, R, v);
		if (mid < R) modify(rs, mid + 1, r, L, R, v);
		pushup(x);
	}
	int ask(int x, int l, int r, int L, int R) {
		if(L>R) return 0;
		if (l >= L && r <= R) return t[x];
		pushdown(x,l,r);
		int res = 0;
		if (mid >= L) res = res + ask(ls, l, mid, L, R);
		if (mid < R) res = res + ask(rs, mid + 1, r, L, R);
		return res;
	}
	int get(int x, int l, int r) {
		if(l==r) return l;
		pushdown(x,l,r);
		if(t[rs]) return get(rs,mid+1,r);
		return get(ls,l,mid);
	}
	void init() {
		memset(t,0,sizeof t);
		memset(tag,-1,sizeof tag);
	}
} St;

int n,m,a[N];
void add(int x) {
	int l=x,r=M,p=x-1;
	while(l<=r) {
		if(St.ask(1,1,M,x,mid)==mid-x+1) p=mid,l=mid+1;
		else r=mid-1;
	}
	St.modify(1,1,M,x,p,0);
	St.modify(1,1,M,p+1,p+1,1);
}
void del(int x) {
	int l=x,r=M,p=x-1;
	while(l<=r) {
		if(St.ask(1,1,M,x,mid)==0) p=mid,l=mid+1;
		else r=mid-1;
	}
	St.modify(1,1,M,x,p,1);
	St.modify(1,1,M,p+1,p+1,0);
}
signed main() {
	St.init(), n = read(),m=read();
	for(int i=1; i<=n; ++i) add(a[i]=read());
	while(m--) {
		int x=read(),y=read();
		del(a[x]),add(a[x]=y);
		put(St.get(1,1,M)),putchar('\n');
	}
	return 0;
}
2022/7/16 00:06
加载中...