1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| #include<iostream> #include<cstdio> #include<algorithm> #include<set> using namespace std; const int N=5e5+10; template<class T> inline void read(T &x) { x=0;int f=0; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}; while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); if(f)x=~x+1; } template<class T,class ...T1> inline void read(T &x,T1 &...x1) { read(x),read(x1...); } int n,m; int a[N]; int tot,c[N<<1]; set<int>p[N<<1]; struct Op { int x,y; }op[N]; struct Seg { struct Node { int l,r; int v,tag; }tr[N<<3]; void pushup(int x){tr[x].v=max(tr[x<<1].v,tr[x<<1|1].v);} void update(int x,int k) { tr[x].v+=k; tr[x].tag+=k; } void pushdown(int x) { if(tr[x].tag) { update(x<<1,tr[x].tag); update(x<<1|1,tr[x].tag); tr[x].tag=0; } } void build(int x,int l,int r) { tr[x].l=l,tr[x].r=r; tr[x].tag=0,tr[x].v=0; if(l==r)return ; int mid=l+r>>1; build(x<<1,l,mid),build(x<<1|1,mid+1,r); pushup(x); } void add(int x,int l,int r,int k) { if(l<=tr[x].l&&tr[x].r<=r)return update(x,k); pushdown(x); int mid=tr[x].l+tr[x].r>>1; if(l<=mid)add(x<<1,l,r,k); if(r>mid)add(x<<1|1,l,r,k); pushup(x); } }seg; void add(int pos,int val) { if(!p[val].empty())seg.add(1,val,val,-*p[val].rbegin()); seg.add(1,val,tot,-1); p[val].insert(pos); seg.add(1,val,val,*p[val].rbegin()); } void del(int pos,int val) { seg.add(1,val,val,-*p[val].rbegin()); seg.add(1,val,tot,1); p[val].erase(pos); if(!p[val].empty())seg.add(1,val,val,*p[val].rbegin()); } int main() { read(n,m); for(int i=1;i<=n;i++)read(a[i]),c[++tot]=a[i]; for(int i=1;i<=m;i++)read(op[i].x,op[i].y),c[++tot]=op[i].y,op[i].x++; sort(c+1,c+1+tot); tot=unique(c+1,c+1+tot)-c-1; seg.build(1,1,tot);
for(int i=1;i<=n;i++) { a[i]=lower_bound(c+1,c+1+tot,a[i])-c; p[a[i]].insert(i); seg.add(1,a[i],tot,-1); } for(int i=1;i<=tot;i++) { if(p[i].empty())continue; int x=*p[i].rbegin(); seg.add(1,i,i,x); } for(int i=1;i<=m;i++) { int &now=a[op[i].x]; op[i].y=lower_bound(c+1,c+1+tot,op[i].y)-c; del(op[i].x,now); now=op[i].y; add(op[i].x,now); printf("%d\n",seg.tr[1].v); } return 0; }
|