两个multiset
一个记录相邻元素的差,一个放所有的元素
2个数组
val[i]记录第i个的值,last[i]记录第i个最后插入的数的值
然后乱搞
#include <set> #include <cstdio> #include <iostream> #define N 1001000 #define abs(x) ((x) < 0 ? -(x) : (x)) #define min(x, y) ((x) < (y) ? (x) : (y)) #define max(x, y) ((x) > (y) ? (x) : (y)) using namespace std; int n, m, ans = 1e9; int val[N], last[N]; multiset <int> s, ss; multiset <int> :: iterator it; inline int read() { int x = 0, f = 1; char ch = getchar(); for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; return x * f; } inline void set_insert(int x) { s.insert(x); it = s.lower_bound(x); if(it != s.begin()) it--, ans = min(ans, abs(*it - x)), it++; if((++it) != s.end()) ans = min(ans, abs(*it - x)); } inline void insert(int x, int y) { if(x != n) ss.erase(ss.lower_bound(abs(last[x] - val[x + 1]))); ss.insert(abs(last[x] - y)); if(x != n) ss.insert(abs(val[x + 1] - y)); last[x] = y; set_insert(y); } int main() { int i, x, y; char s[21]; n = read(); m = read(); for(i = 1; i <= n; i++) { last[i] = val[i] = read(); set_insert(val[i]); if(i > 1) ss.insert(abs(val[i] - val[i - 1])); } for(i = 1; i <= m; i++) { scanf("%s", s); if(s[4] == 'R') { x = read(); y = read(); insert(x, y); } if(s[4] == 'G') printf("%d ", *ss.begin()); if(s[4] == 'S') printf("%d ", ans); } return 0; }