tyvj P1039 线段树点修改和区间查询
2015-12-05 21:53
501 查看
描述
老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。在询问过程中账本的内容可能会被修改
输入格式
输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。接下来每行为3个数字,第一个p为数字1或数字2,第二个数为x,第三个数为y
当p=1 则查询x,y区间
当p=2 则改变第x个数为y
输出格式
输出文件中为每个问题的答案。具体查看样例。//#include "stdafx.h" #include <iostream> #include <string> #include <cstring> #include <cmath> #include <list> #include <deque> #include <vector> #include <cstdlib> #include <cctype> #include <ctime> #include <stack> #include <queue> #include <sstream> #include <algorithm> #include <set> #include <functional> #include <algorithm> #include <iomanip> #include <complex> #include <cstdio> using namespace std; #define retunr return #define ture true #define flase false #define itn int inline void read(int &x) { scanf("%d", &x); } int n, m; int Block[100001]; struct Node { int val; int l, r; Node* left, *right,*Parent; Node() { left = NULL; right = NULL; Parent = NULL; } }; Node* Root=NULL; Node* MakeTree(int l,int r) { if (l == r) { Node* Retn = new Node(); Retn->val = Block[l]; Retn->l = Retn->r = r; retunr Retn; } int mid = (l + r) / 2; Node* Retn = new Node(); Retn->left = MakeTree(l, mid); Retn->right = MakeTree(mid + 1, r); Retn->left->Parent = Retn; Retn->right->Parent = Retn; Retn->val = min(Retn->left->val, Retn->right->val); Retn->l = l; Retn->r = r; return Retn; } int Query(int l, int r,Node* Area) { if (l == r)return Block[l]; int &tl = Area->l; int &tr = Area->r; int mid = (l + r) / 2; int tmid = (tl + tr) / 2; if (tl == l) { if (tr == r)return Area->val; if (r <= Area->left->r) { return Query(l, r, Area->left); } return min(Query(l, Area->left->r, Area->left), Query(Area->right->l, r, Area->right)); } if (tr == r) { if (l >= Area->right->l)return Query(l, r, Area->right); return min(Query(l, Area->left->r, Area->left), Query(Area->right->l, r, Area->right)); } if(r <= Area->left->r )return Query(l, r, Area->left); if (l >= Area->right->l)return Query(l, r, Area->right); return min(Query(l, Area->left->r, Area->left), Query(Area->right->l, r, Area->right)); } void CleanMemory(Node* rm) { if (!rm)return; CleanMemory(rm->left); CleanMemory(rm->right); delete rm; } void Update(int n, int t,Node* curr) { if (curr->l == curr->r) { Block = t; curr->val = t; return; } if (n <= curr->left->r) { Update(n, t, curr->left); curr->val = min(curr->left->val, curr->right->val); } if (n >= curr->right->l) { Update(n, t, curr->right); curr->val = min(curr->right->val, curr->left->val); } } int main() { read(m);read(n); for (int i = 0;i < m;i++)read(Block[i]); Root=MakeTree(0,m-1); while (n--) { int l, r,c; read(c);read(l);read(r); if(c==1)printf("%d ", Query(l-1, r-1, Root)); else Update(l-1,r,Root); } CleanMemory(Root); return 0; }
相关文章推荐
- 浏览器处理 前台传递的+时出现问题
- 【Leetcode】Rotate Image
- Android中startActivity中的permission检测与UID机制
- MYSQL的binary解决mysql数据大小写敏感问题
- 如何在RHEL/CentOS 7.0中使用tmpfs
- 黑马程序员-Java的面向对象(抽象类、接口、内部类和继承、组合、多态)
- ospf point-to-point 网络类型
- 单链表的翻转
- html文件基本结构
- day2
- HDU5592 排队问题 xingxing在努力
- 跨浏览器检测flash是否存在
- iOS解决tableView左边分割线有间距问题
- 10016---jQuery--CSS类
- python核心编程-lambda
- LightOJ 题目1079 Just another Robbery(01背包)
- BestCoder Round #65
- [Android] Service服务详解以及怎么使service服务不被杀死
- 实例详解Spring MVC入门使用
- day1