传送门

一开始想的是区间线段树套权值线段树,结果好像不能实现。

然后题解是权值线段树套区间线段树。

区间线段树上标记永久化就省去了pushdown的操作减少常数。

标记永久化的话。。yy不出来就看代码吧。

然后注意开long long

#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 50010
#define LL long long using namespace std; int n, m, t, cnt;
LL sum[N * 200];
int opt[N], a[N], b[N], c[N], g[N], add[N * 200], ls[N * 200], rs[N * 200], root[N << 2]; 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 insert2(int &now, int l, int r, int x, int y)
{
if(!now) now = ++cnt;
if(x <= l && r <= y)
{
add[now]++;
sum[now] += r - l + 1;
return;
}
int mid = (l + r) >> 1;
if(x <= mid) insert2(ls[now], l, mid, x, y);
if(mid < y) insert2(rs[now], mid + 1, r, x, y);
sum[now] = sum[ls[now]] + sum[rs[now]] + (LL)(r - l + 1) * add[now];
} inline void insert1(int now, int l, int r, int d, int x, int y)
{
insert2(root[now], 1, n, x, y);
if(l == r) return;
int mid = (l + r) >> 1;
if(d <= mid) insert1(now << 1, l, mid, d, x, y);
else insert1(now << 1 | 1, mid + 1, r, d, x, y);
} inline LL query2(int now, int l, int r, int x, int y)
{
if(x <= l && r <= y) return sum[now];
LL tmp = 0;
int mid = (l + r) >> 1;
if(x <= mid) tmp += query2(ls[now], l, mid, x, y);
if(mid < y) tmp += query2(rs[now], mid + 1, r, x, y);
return tmp + (LL)(min(r, y) - max(l, x) + 1) * add[now];
} inline int query1(int now, int l, int r, LL d, int x, int y)
{
if(l == r) return l;
int mid = (l + r) >> 1;
LL tmp = query2(root[now << 1 | 1], 1, n, x, y);
if(tmp < d) return query1(now << 1, l, mid, d - tmp, x, y);
else return query1(now << 1 | 1, mid + 1, r, d, x, y);
} int main()
{
int i;
n = read();
m = read();
for(i = 1; i <= m; i++)
{
opt[i] = read();
a[i] = read(), b[i] = read(), c[i] = read();
if(opt[i] == 1) g[++t] = c[i];
}
sort(g + 1, g + t + 1);
t = unique(g + 1, g + t + 1) - g - 1;
for(i = 1; i <= m; i++)
if(opt[i] == 1)
{
c[i] = lower_bound(g + 1, g + t + 1, c[i]) - g;
insert1(1, 1, t, c[i], a[i], b[i]);
}
else printf("%d\n", g[query1(1, 1, t, c[i], a[i], b[i])]);
return 0;
}

  

最新文章

  1. C# 委托应用总结
  2. [转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
  3. Delphi中的接口和抽象类
  4. 【仅支持移动设备】Swipe.JS轻量级移动幻灯效果
  5. 部署基于JDK的webservice服务类
  6. ASP.NET Web API安全认证
  7. node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传
  8. winRAR将单独文件分别压缩打包
  9. Python基础第四天
  10. MySQL忘记了密码登录不进去,用命令符修改新的密码重新登录的方法
  11. 使用CSS3制图
  12. Iterator(es6)
  13. SICP-1.5-控制结构
  14. Codeforces A. Trip For Meal
  15. centos下使用yum 安装pip
  16. 聚类——WKFCM的matlab程序
  17. 使用Request+正则抓取猫眼电影(常见问题)
  18. Spring Cloud Eureka简介及原理
  19. c++ 日志输出库 spdlog 简介(1)
  20. 洛谷 P4408 逃学的小孩 解题报告

热门文章

  1. 机器学习中正则化项L1和L2的直观理解
  2. LuceneTest
  3. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第十节
  4. 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 FTP 服务器
  5. SummerVocation_Learning--java的线程机制
  6. Apache 查找httpd.conf文件
  7. 【CodeBase】PHP转换编码,读写文件/网页内容的防乱码方法
  8. Spark性能优化:资源调优篇
  9. VMware之无法切换桥接网络
  10. 图学java基础篇之集合工具