bzoj3110树套树

wa一片,最后一个T,终于心碎了。。。

为什么没人告诉我要开longlong

为什么所有人都说没有负数

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define mid ((l+r)>>1)
 4 using namespace std;
 5 long long cas,a,b,c,k,l,r,n,m,sz;
 6 int root[200005];
 7 int ls[10000005],rs[10000005],sum[10000005],lazy[10000005];
 8 void pushdown(int k,int l,int r)
 9 {
10     if(!lazy[k]||l==r)return;
11     if(!ls[k])ls[k]=++sz;
12     if(!rs[k])rs[k]=++sz;
13     lazy[ls[k]]+=lazy[k];lazy[rs[k]]+=lazy[k];
14     sum[ls[k]]+=(mid-l+1)*lazy[k];
15     sum[rs[k]]+=(r-mid)*lazy[k];
16     lazy[k]=0;
17 }
18 void add(int k,int l,int r,int a,int b)
19 {
20     if(l==a&&r==b)
21     {
22         sum[k]+=r-l+1;
23         lazy[k]++;
24         return;
25     }
26     pushdown(k,l,r);
27     if(a<=mid)ls[k]=ls[k]?ls[k]:++sz,add(ls[k],l,mid,a,min(b,mid));
28     if(b>mid)rs[k]=rs[k]?rs[k]:++sz,add(rs[k],mid+1,r,max(mid+1,a),b);
29     sum[k]=sum[ls[k]]+sum[rs[k]];
30 }
31 long long que(int k,int l,int r,int a,int b)
32 {
33     if(!k)return 0;
34     if(l==a&&r==b)return sum[k];
35     pushdown(k,l,r);
36     if(b<=mid)return que(ls[k],l,mid,a,b);
37     else if(a>mid)return que(rs[k],mid+1,r,a,b);
38     else return que(ls[k],l,mid,a,mid)+que(rs[k],mid+1,r,mid+1,b);
39 }
40 int solve()
41 {
42     int l=1,r=2*n,k=1;
43     while(l!=r)
44     {
45         long long t=que(root[k<<1|1],1,n,a,b);
46         if(c<=t)l=mid+1,k=k<<1|1;
47         else r=mid,k=k<<1,c-=t;
48     }
49     return l;
50 }
51 int main()
52 {
53     for(scanf("%d%d",&n,&m);m;m--)
54     {
55         scanf("%d%d%d%d",&cas,&a,&b,&c);
56         if(cas==1)
57             for(k=1,l=1,r=2*n,c+=n;l!=r;root[k]=root[k]?root[k]:++sz,add(root[k],1,n,a,b))
58                 if(c<=mid)r=mid,k=k<<1;
59                 else l=mid+1,k=k<<1|1;
60         else printf("%d\n",solve()-n);
61     }
62     return 0;
63 }

这次代码还是比较优美的

posted @ 2016-09-17 20:26  汪立超  阅读(259)  评论(0编辑  收藏  举报