每个节点维护一个最小值,更新发现如果大于最小值,直接向下更新。速度还可以。。
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> #include<cmath> #include<queue> #include<map> using namespace std; const int maxn=50005; int sum[maxn<<2],b[maxn<<2]; void pushup(int rt) { sum[rt]=sum[rt*2]+sum[rt*2+1]; b[rt]=min(b[rt*2],b[rt*2+1]); } void change(int rt,int l,int r,int x,int y,int c) { int m=(l+r)>>1; if(l==r) { sum[rt]=b[rt]=c; return; } if(x<=m&&b[rt*2]<c)change(rt*2,l,m,x,y,c); if(y>m&&b[rt*2+1]<c)change(rt*2+1,m+1,r,x,y,c); pushup(rt); } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int x,y,z; memset(sum,0,sizeof(sum)); memset(b,0,sizeof(b)); for(int i=0; i<m; i++) { scanf("%d%d%d",&x,&y,&z); change(1,1,n,x+1,y,z); } printf("%d ",sum[1]); } return 0; }