templete_线段树

来源:互联网 发布:单片机电流检测电路图 编辑:程序博客网 时间:2024/06/01 14:50
#include <stdio.h>#include <string.h>#include <iostream>#include <string>using namespace std;const int MAXNODE = 1000 * 4;//½áµãµÄÊýÄ¿Ò»°ãÊÇ×î´ó·¶Î§µÄËı¶¡£ struct Tree{int val; //ÕâÊÇÕâ¸ö½áµãËù´ú±íµÄÆäËûµÄÒâÒ壬Õâ¸öÄã¿ÉÒÔ¸ù¾ÝÌâÒâ×Ô¼º¸Ä±ä int L, R;//ÕâÊǽáµãËù´ú±íµÄ·¶Î§£» }tree[MAXNODE];void pushUp(int i)//ÕâÊǸù¾ÝÌâÄ¿µÄÒâÒå×ö³öÉÏÍƵĶ¯×÷£¬Õâ¸ö¸ù¾ÝÌâÄ¿Òâ˼£¬¿´Ó¦¸ÃÔõÑùµÄÉÏÍÆ {//ÕâÀï¼Ù¶¨ÊÇÇó´óÖµ£»tree[i].val = max(tree[i << 1].val, tree[i << 1 | 1].val); }void buildTree(int i, int L, int R){tree[i].L = L;tree[i].R = R;tree[i].val = 0;if (L == R){int val;scanf("%d", &val); tree[i].val = val;//ÕâÀïÊÇÓÃÀ´È¡Êý¾ÝµÄ¡£ return ;//Ò»¶¨Òª×¢Òâreturn; }int mid = L + (R - L) / 2;buildTree(i << 1, L, mid);buildTree(i << 1 | 1, mid + 1, R);pushUp(i); }void update(int i, int key, int val) //µ¥µã¸üС£ {if (tree[i].L == key && tree[i].R == key){tree[i].val = val;return ; //ÕâÀïÒ²ÊÇҪעÒâµÄ£¬¸üÐÂÍêÁËÖ®ºóÒ»¶¨Òª¼ÇµÃ·µ»Ø }int mid = tree[i].L + (tree[i].R - tree[i].L) / 2;if (key <= mid){update(i << 1, key, val);}else{update(i << 1 | 1, key, val);}pushUp(i);}int query(int i, int L, int R){if (L <= tree[i].L && R >= tree[i].R) //ÕâÀïÊÇÈ¥³ýÌØÊâÊý¾ÝµÄ²»´íÑ¡Ôñ {return tree[i].val;}int mid = tree[i].L + (tree[i].R - tree[i].L) / 2;if (R <= mid){return query(i << 1, L, R);}else if (L > mid){return query(i << 1 | 1, L, R);}else{return max(query(1 << 1, L, mid), query(i << 1 | 1, mid + 1, R));}}int main(){int N, M;while (scanf("%d%d", &N, &M) != EOF){buildTree(1, 1, N);int temp;int a, b;for (int i = 0; i < M; i++){scanf("%d", &temp);if (temp == 0){scanf("%d%d", &a, &b);update(1, a, b);}else{scanf("%d%d", &a, &b);int ans = query(1, a, b);printf("The ans is : %d\n", ans);}}}system("pause");return 0;}

原创粉丝点击